home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / VGADOC4B.ZIP / BITBLT.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1995-09-29  |  71.3 KB  |  2,463 lines

  1.  (* This file holds all the BITBLT, Line draw, HW cursor and clock
  2.     functions *)
  3.  
  4.   {Wait for WD engine ready}
  5. procedure WD_wait;
  6. begin
  7.   if cv.version=WD_90c33 then
  8.     repeat until (inp($23CE) and 15)=0
  9.   else begin  {c31,c24}
  10.     outpw($23C0,$1001);
  11.     repeat until (inpw($23C2) and $800)=0;
  12.   end;
  13. end;
  14.  
  15. procedure WD_outl(index:word;l:longint);
  16. begin
  17.   outpw($23C2,index+(l and $FFF));
  18.   outpw($23C2,index+$1000+(l shr 12));
  19. end;
  20.  
  21. procedure setHWcurmap(VAR map:CursorType);
  22. var x,y,z,w,lbank,x0,y0:word;
  23.   l,curadr:longint;
  24.   bm:array[0..127] of byte;
  25.   mp:record
  26.        case integer of
  27.     0:(b:array[0..2047] of byte);
  28.     1:(w:array[0..1023] of word);
  29.     2:(l:array[0..511] of longint);
  30.      end;
  31.  
  32. procedure copyCurMap(bytes:word);
  33. var x,y:word;
  34.    l:longint;
  35. begin
  36.   l:=curadr;
  37.   if memmode=_PL4 then l:=l shr 2;
  38.   setbank(l shr 16);
  39.   if memmode=_PL4 then
  40.   begin
  41.     wrinx(GRC,3,0);
  42.     clrinx(GRC,5,$3);
  43.     wrinx(GRC,8,$FF);
  44.     for x:=0 to bytes-1 do
  45.     begin
  46.       wrinx(SEQ,2,1 shl (x and 3));
  47.       y0:=mem[SegA000:l];
  48.       mem[SegA000:l]:=mp.b[x];
  49.       if (x and 3)=3 then inc(l);
  50.     end;
  51.   end
  52.   else move(mp,mem[SegA000:l],bytes);
  53. end;
  54.  
  55. function al_packmap(map:byte):word;
  56. var i,j:word;
  57. begin
  58.   j:=0;
  59.   for i:=0 to 7 do
  60.   begin
  61.     j:=j shl 2+2;
  62.     if ((map shr i) and 1)>0 then dec(j);
  63.   end;
  64.   al_packmap:=j;
  65. end;
  66.  
  67. function al_packmap2(map:byte):longint;
  68. var i:word;
  69.     j:longint;
  70. begin
  71.   j:=0;
  72.   for i:=0 to 7 do
  73.   begin
  74.     j:=j shl 4+$A;
  75.     if ((map shr i) and 1)>0 then dec(j,5);
  76.   end;
  77.   al_packmap2:=j;
  78. end;
  79.  
  80. function pack8to16(w:word):word;
  81. var x,i:word;
  82. begin
  83.   i:=0;
  84.   for x:=0 to 7 do
  85.   begin
  86.     i:=i shl 2;
  87.     if ((w shl x) and 128)>0 then inc(i,3);
  88.   end;
  89.   pack8to16:=i;
  90. end;
  91.  
  92. function swapb(b:word):word;
  93. var i,j:word;
  94. begin
  95.   j:=0;
  96.   for i:=0 to 7 do
  97.     if ((b shr i) and 1)>0 then inc(j,128 shr i);
  98.   swapb:=j;
  99. end;
  100.  
  101. function swapl(l:longint):longint;
  102. var
  103.   x,y:array[0..3] of byte;
  104. begin
  105.   swapl:=(l and $FF0000FF)+((l shl 8) and $FF0000)
  106.         +((l shr 8) and $FF00)
  107. end;
  108.  
  109. begin
  110.   curadr:=cv.mm*longint(1024)-2048;
  111.  { if memmode=_pl4 then curadr:=curadr shr 2;}
  112.  
  113.   move(map,mp,128);
  114.   move(map,bm,128);
  115.   if dacHWcursor then
  116.     case cv.dactype of
  117.     _dacBT484,_dacBt485:
  118.         begin
  119.           outp(setDACpage(dacSTDwrInx),$80);
  120.           for x:=0 to 127 do outp(setDACpage(dacBTcMap),not mp.b[x]);
  121.           outp(setDACpage(dacSTDwrInx),0);
  122.           for x:=0 to 127 do outp(setDACpage(dacBTcMap),mp.b[x]);
  123.           modreg(setDACpage(dacBTcmd2),3,2);
  124.         end;
  125.     _dacTVP3010,_dacTVP3020,_dacTVP3025:
  126.         begin
  127.           fillchar(mp,1024,$AA);
  128.           y:=124;
  129.           for x:=127 downto 0 do  {repack from 32x32x1 to 64x64x2 map}
  130.           begin
  131.             mp.w[y+x]:=swap(pack8to16(bm[x])) or $AAAA;
  132.             if (x and 3)=0 then dec(y,4);
  133.           end;
  134.  
  135.           wrDACreg(dacTVPindex,6);
  136.           modDACreg(dacTVPdata,$C0,$40);   {TVP302x mode & MS-Win cursor}
  137.           wrDACreg(dacTVPindex,8);
  138.           wrDACreg(dacTVPdata,0);
  139.           wrDACreg(dacTVPindex,9);
  140.           wrDACreg(dacTVPdata,0);
  141.           wrDACreg(dacTVPindex,$A);  {Select Cursor RAm index}
  142.           for x:=0 to $3FF do wrDACreg(dacTVPdata,mp.b[x]);
  143.           wrDACreg(dacTVPindex,4);
  144.           wrDACreg(dacTVPdata,0);
  145.           wrDACreg(dacTVPindex,5);
  146.           wrDACreg(dacTVPdata,0);
  147.         end;
  148.     _dacTVP3026:
  149.         begin
  150.           fillchar(mp,1024,$AA);
  151.           y:=124;
  152.           for x:=127 downto 0 do  {repack from 32x32x1 to 64x64x2 map}
  153.           begin
  154.             mp.w[y+x]:=swap(pack8to16(bm[x])) or $AAAA;
  155.             if (x and 3)=0 then dec(y,4);
  156.           end;
  157.  
  158.           wrDACreg(dacTVP6index,6);
  159.           modDACreg(dacTVP6data,$C0,$40);   {TVP302x mode & MS-Win cursor}
  160.           wrDACreg(dacTVP6index,8);
  161.           wrDACreg(dacTVP6data,0);
  162.           wrDACreg(dacTVP6index,9);
  163.           wrDACreg(dacTVP6data,0);
  164.           wrDACreg(dacTVP6index,$A);  {Select Cursor RAm index}
  165.           for x:=0 to $3FF do wrDACreg(dacTVP6data,mp.b[x]);
  166.           wrDACreg(dacTVP6index,4);
  167.           wrDACreg(dacTVP6data,0);
  168.           wrDACreg(dacTVP6index,5);
  169.           wrDACreg(dacTVP6data,0);
  170.         end;
  171.     end
  172.   else
  173.     case cv.chip of
  174.      __AGX:begin
  175.          wrinx(cv.IOadr+10,$36,0);
  176.          wrinx(cv.IOadr+10,$32,32);
  177.          wrinx(cv.IOadr+10,$35,32);
  178.          x:=((cv.mm shr 1)-1) xor $1DF;
  179.          wrinx(cv.IOadr+10,$6E,x);
  180.          modinx(cv.IOadr+10,$6F,3,hi(x));
  181.          wrinx2(cv.IOadr+10,$60,512);
  182.          y:=128;
  183.          for x:=127 downto 0 do
  184.          begin
  185.            mp.w[x+y]:=pack8to16(swapb(bm[x])) xor $AAAA;
  186.            if (x and 3)=0 then dec(y,4);
  187.          end;
  188.          for x:=0 to 511 do wrinx(cv.IOadr+10,$6A,mp.b[x]);
  189.          wrinx(cv.IOadr+10,$36,1);
  190.            end;
  191.      __ALG:begin
  192.          x0:=0;
  193.          fillchar(mp,1024,$AA);
  194.          if memmode<=_p8 then
  195.          begin
  196.            y:=0;
  197.            for x:=0 to 127 do
  198.            begin
  199.              mp.w[y+x]:=al_packmap(bm[x]);
  200.              if (x and 3)=3 then inc(y,4);
  201.            end;
  202.          end
  203.          else
  204.            for x:=0 to 127 do  {Double size for 64k mode}
  205.              mp.l[x]:=al_packmap2(bm[x]);
  206.                  curadr:=(cv.mm-1)*longint(1024);
  207.          CopyCurMap(1024);
  208.                  w:=cv.mm-1{curadr shr 10};
  209.          if cv.version=ALG_2101 then
  210.          begin
  211.            wrinx2(crtc,$27,w);
  212.          end
  213.          else begin
  214.            outpw($82C8,w);
  215.          end;
  216.          x:=inp(crtc+6);     {force ATTR to address mode}
  217.          x:=inp($3C0);
  218.          y:=rdinx($3C0,$31);    {Must preserve index 11h and 12h}
  219.          z:=rdinx($3C0,$32);
  220.          wrinx($3C0,$35,$FF);   {Foreground index #}
  221.          wrinx($3C0,$36,0);
  222.          wrinx($3C0,$31,y);
  223.          wrinx($3C0,$32,z);
  224.          outp($3C0,x);
  225.            end;
  226.         __Alli:begin
  227.                  curadr:=2048;
  228.                  for x:=0 to 255 do mp.l[x]:=$55AAFF;
  229.                  CopyCurMap(1024);
  230.                  if mem[SegA000:$D8]=0 then;
  231.                  outpw(SEQ,$1210);
  232.                  setinx(SEQ,$1C,8);
  233.                  modinx(SEQ,$1B,15,1);
  234.  
  235.                  memw[SegA000:$7944]:=curadr shr 10;
  236.                  memw[SegA000:$794C]:=$2020;
  237.                  mem [SegA000:$7940]:=1;
  238.  
  239.                  clrinx(SEQ,$1B,7);
  240.                  clrinx(SEQ,$1C,8);
  241.                end;
  242.          __ARK:begin         {Doesn't work yet}
  243.                  curadr:=cv.mm*longint(1024)-256;
  244.                  for x:=0 to 127 do mp.w[x]:=(bm[x]*$101) xor $FF;
  245.                  CopyCurMap(256);
  246.                  case colbits[memmode] of
  247.                  15,16:x:=1;
  248.                  24,32:x:=2;
  249.                  else  x:=0;
  250.                  end;
  251.                  wrinx(SEQ,$20,x or 8);
  252.                  wrinx(SEQ,$25,$3F);
  253.                  wrinx2(SEQ,$2C,$0);   {Hotspot}
  254.                end;
  255.        __chips:if cv.version=CT_452 then
  256.            begin
  257.          for x:=255 downto 0 do
  258.            mp.w[x]:=mp.w[x div 4];
  259.          CopyCurMap(512);
  260.  
  261.          wrinx(cv.IOadr,$A,0);
  262.          wrinx2m(cv.IOadr,$30,{cv.mm*longint(64)-$20}curadr shr 4);
  263.          wrinx(cv.IOadr,$32,$ff);
  264.          wrinx(cv.IOadr,$37,1);
  265.          wrinx(cv.IOadr,$38,$FF);
  266.          wrinx(cv.IOadr,$39,0);
  267.          wrinx(cv.IOadr,$3A,$FF);  {Cursor FG color index}
  268.            end;
  269.        __cir54:begin
  270.          clrinx(SEQ,$12,3);
  271.          wrinx(GRC,11,$24);
  272.          move(mp,mp.b[128],128);
  273.          CopyCurMap(256);
  274.          setHWcurcol($ff0000,$ff);
  275.          wrinx(SEQ,$13,$38);  {Cursor at End of Ram -2K}
  276.            end;
  277.       __Mach32:begin
  278.          outp($1AEF,255);
  279.          outpw($1EEE,0);
  280.                  fillchar(mp,1024,$AA);
  281.                  y:=0;
  282.                  for x:=0 to 127 do
  283.                  begin
  284.                    mp.w[y+x]:=al_packmap(bm[x]);
  285.                    if (x and 3)=3 then inc(y,4);
  286.                  end;
  287.  
  288.                  CopyCurMap(1024);
  289.  
  290.          l:={(cv.mm*longint(1024)-1024) div 4}curadr shr 2;
  291.          outpw($AEE,l);
  292.          outpw($EEE,(l shr 16) or $8000);
  293.            end;
  294.       __Mach64:begin
  295.                  meml[cv.Xseg:$70]:=$200020;
  296.                  meml[cv.Xseg:$68]:=curadr shr 3;
  297.                  y:=4;
  298.                  for x:=0 to 127 do
  299.                  begin
  300.                    mp.w[y+x]:=al_packmap(bm[x]);
  301.                    if (x and 3)=3 then inc(y,4);
  302.                  end;
  303.                  {for x:=0 to 127 do mp.l[x]:=$55AAFF; }
  304.                  CopyCurMap(1024);
  305.                  setreg($66EC,$80);
  306.                end;
  307.      __ncr:begin
  308.          w:=curadr shr 6;
  309.                       {(cv.mm*longint(16))-4;    {256 bytes from the end of Vmem.}
  310.          y:=128;
  311.          for x:=127 downto 0 do
  312.          begin
  313.            mp.b[x+y]:=swapb(mp.b[x]);
  314.            if (x and 3)=0 then dec(y,4);
  315.          end;
  316.          for x:=0 to 31 do
  317.            mp.l[x*2]:=mp.l[x*2+1] xor $FFFFFFFF;
  318.  
  319.          wrinx2m(SEQ,$11,$101);
  320.          CopyCurMap(256);
  321.  
  322.                  wrinx(SEQ,$A,$FF);   {Fg color}
  323.          wrinx(SEQ,$B,$0);
  324.          wrinx2m(SEQ,$13,0);
  325.          wrinx2m(SEQ,$15,w);
  326.          wrinx(SEQ,$17,$FF);
  327.                  w:=3;  {Enable & 32x32}
  328.                  if cv.version>=NCR_77c22ep then
  329.                    case memmode of
  330.                      _P15,_P16:w:=w or $20;
  331.                     _P24,_P24b:w:=w or $40;
  332.         _P32,_P32b,_P32c,_P32d:w:=w or $60;
  333.                    end;
  334.          wrinx(SEQ,$C,w);
  335.            end;
  336.          __Oak:if cv.Version>=OAK_083 then
  337.                begin
  338.          for x:=0 to 255 do mp.l[x]:=0;
  339.          y:=384;
  340.                  for x:=127 downto 0 do
  341.                  begin
  342.                    mp.b[x+y]:=swapb(bm[x] xor 255);
  343.                    if (x and 3)=0 then dec(y,12);
  344.                  end;
  345.  
  346.                  CopyCurMap(1024);
  347.  
  348.                  wrinx2($3DE,$44,$1f20);    {Limit to 32x32}
  349.                  l:=curadr shr 3;
  350.                  wrinx2($3DE,$47,l);
  351.                  wrinx2($3DE,$49,l shr 16);
  352.                  wrinx($3DE,$4A,255);
  353.                  wrinx($3DE,$4B,254);
  354.                  wrinx($3DE,$4C,1);
  355.                end;
  356.       __S3:begin
  357.          wrinx(crtc,$39,$A0);
  358.          if (memmode>_p8) and (cv.Version<=S3_924) then
  359.          begin
  360.            for x:=0 to 127 do
  361.            begin
  362.              y:=pack8to16(bm[x]);
  363.              mp.l[x]:=(longint(lo(y)) shl 24)+(y and $FF00)+$FF00FF;
  364.            end;
  365.            for x:=256 to 511 do mp.w[x]:=$ff;
  366.          end
  367.          else begin
  368.            for x:=0 to 255 do mp.l[x]:=$ffff;  {Transparent}
  369.            y:=376;
  370.            for x:=127 downto 0 do
  371.            begin
  372.              mp.b[x+y]:=bm[x];
  373.              mp.b[x+y-2]:=not bm[x];
  374.              if (x and 1)=0 then dec(y,2);
  375.              if (x and 3)=0 then dec(y,8);
  376.            end;
  377.            if memmode=_pk4a then
  378.                      for x:=0 to 511 do
  379.                        mp.b[x]:=lo((mp.b[x] shl 4)+(mp.b[x] shr 4));
  380.                    if (cv.Version=S3_801AB) and ((rdinx(crtc,$58) and $10)=0) then
  381.                      for x:=0 to 255 do                 {What a hack....}
  382.                        mp.l[x]:=(mp.l[x] and $FF0000FF)
  383.                               +((mp.l[x] shl 8) and $FF0000)
  384.                               +((mp.l[x] shr 8) and $FF00);
  385.          end;
  386.          CopyCurMap(1024);
  387.                  wrinx(crtc,$39,$A0);  {CurMap turns off Ext Regs}
  388.                  if cv.Version>S3_924 then wrinx(crtc,$58,x);
  389.          wrinx2(crtc,$4E,0);
  390.          wrinx2m(crtc,$4C,curadr shr 10);
  391.          wrinx(crtc,$39,0);
  392.            end;
  393.          __SiS:begin
  394.                  curadr:=cv.mm*longint(1024)-$4000;
  395.                  for x:=0 to 255 do mp.l[x]:=$AAAAAAAA;
  396.          y:=124;
  397.                  for x:=127 downto 0 do
  398.                  begin
  399.                    w:=0;
  400.                    for z:=7 downto 0 do
  401.                    begin
  402.                      w:=w shl 2;
  403.                      if ((bm[x] shr z) and 1)=0 then inc(w,2);
  404.                    end;
  405.                    mp.w[x+y]:=swap(w);
  406.                    if (x and 3)=0 then dec(y,4);
  407.                  end;
  408.                  CopyCurMap(1024);
  409.                  if (rdinx(SEQ,6) and $20)>0 then  {Interlace}
  410.                  begin
  411.                    inc(curadr,$400);
  412.                    CopyCurMap(1024);
  413.                  end;
  414.                  setinx(SEQ,6,$40);
  415.                  wrinx(SEQ,$1C,0);
  416.                  wrinx(SEQ,$1F,0);
  417.                end;
  418.        __Tseng:if cv.version>=ET_4W32 then
  419.            begin
  420.          for x:=0 to 255 do mp.l[x]:=$AAAAAAAA;
  421.          y:=384;
  422.          begin
  423.            for x:=127 downto 0 do
  424.            begin
  425.              mp.w[x+y]:=al_packmap(bm[x]);
  426.              if (x and 3)=0 then dec(y,4);
  427.            end;
  428.            CopyCurMap(1024);
  429.            wrinx($217A,$EE,1);
  430.            wrinx2($217A,$EB,2);
  431.            {l:=cv.mm*longint(256)-256;}
  432.          end;
  433.          wrinx3($217A,$E8,curadr shr 2);
  434.  
  435.          wrinx($217A,$EF,2);
  436.          wrinx($217A,$ED,0);
  437.          wrinx2($217A,$E2,32);
  438.          wrinx2($217A,$E6,32);
  439.          setinx($217A,$F7,$80);
  440.            end;
  441.         __Trid:begin
  442.                  for x:=0 to 31 do
  443.                  begin
  444.                    mp.l[x*2  ]:=not map[x];
  445.                    mp.l[x*2+1]:=map[x];
  446.                  end;
  447.                  CopyCurMap(256);
  448.                  wrinx2(crtc,$44,curadr shr 10);
  449.                  wrinx2(crtc,$46,0);     {Hotspot = 0,0}
  450.                  wrinx(crtc,$50,$80);
  451.                end;
  452.           __WD:begin   {WD90c24,31,33}
  453.          WD_wait;
  454.          outp($23C0,2);
  455.          for x:=127 downto 0 do
  456.            mp.w[x]:=mp.b[x] shl 8+$ff;  {XOR cursor, how to set
  457.                          fore&bkground colors ?}
  458.  
  459.          CopyCurMap(256);
  460.         { l:=cv.mm*longint(256)-64; }
  461.          WD_outl($1000,curadr shr 2);
  462.  
  463.          if cv.version=WD_90c33 then w:=$C000
  464.                     else w:=$5000;
  465.          outpw($23C2,w);
  466.          if memmode>_p8 then w:=$810 else w:=$860;   {Mode 3}
  467.          outpw($23C2,w);
  468.          outpw($23C0,1);
  469.            end;
  470.       __Cirrus,
  471.       __Video7:begin
  472.          for x:=0 to 63 do mp.w[x]:=mp.w[x] xor $FFFF;
  473.          move(map,mp.b[128],128);
  474.          CopyCurMap(256);
  475.          wrinx(SEQ,$94,curadr shr 8);
  476.          modinx(SEQ,$FF,$60,curadr shr 13);
  477.          setinx(SEQ,$A5,$80); {Enable cursor}
  478.            end;
  479.    __xbe,__xga:begin
  480.          wrinx(cv.IOadr+10,$36,0);
  481.          fillchar(mp,1024,$ff);
  482.          wrinx2(cv.IOadr+10,$60,0);
  483.          for x:=0 to 1024 do wrinx(cv.IOadr+10,$6A,mp.b[x]);
  484.          setHWcurcol($ff0000,$ff);
  485.          wrinx(cv.IOadr+10,$32,0);
  486.          wrinx(cv.IOadr+10,$35,0);
  487.          wrinx(cv.IOadr+10,$36,1);
  488.            end;
  489.     end;
  490.   clearDACpage;
  491. end;
  492.  
  493. procedure setHWcurcol(fgcol,bkcol:longint);
  494. var fgc,bkc:longint;
  495.   w:word;
  496. begin
  497.   fgc:=rgb(fgcol shr 16,hi(fgcol),lo(fgcol));
  498.   bkc:=rgb(bkcol shr 16,hi(bkcol),lo(bkcol));
  499.   if dacHWcursor then
  500.     case cv.dactype of
  501.     _dacBt484,_dacBt485:
  502.         begin
  503.           outp(setDACpage(dacBTcwrInx),1);
  504.           w:=setDACpage(dacBTcData);
  505.           outp(w,bkcol shr 16);
  506.           outp(w,hi(bkcol));
  507.           outp(w,lo(bkcol));
  508.           outp(w,fgcol shr 16);
  509.           outp(w,hi(fgcol));
  510.           outp(w,lo(fgcol));
  511.         end;
  512.     _dacTVP3010,_dacTVP3020,_dacTVP3025:
  513.         begin
  514.           wrDACreg(dacTVPindex,$23);
  515.           wrDACreg(dacTVPdata,bkcol shr 16);
  516.           wrDACreg(dacTVPindex,$24);
  517.           wrDACreg(dacTVPdata,hi(bkcol));
  518.           wrDACreg(dacTVPindex,$25);
  519.           wrDACreg(dacTVPdata,lo(bkcol));
  520.           wrDACreg(dacTVPindex,$26);
  521.           wrDACreg(dacTVPdata,fgcol shr 16);
  522.           wrDACreg(dacTVPindex,$27);
  523.           wrDACreg(dacTVPdata,hi(fgcol));
  524.           wrDACreg(dacTVPindex,$28);
  525.           wrDACreg(dacTVPdata,lo(fgcol));
  526.         end;
  527.     _dacTVP3026:
  528.         begin
  529.           wrDACreg(dacTVP6index,$23);
  530.           wrDACreg(dacTVP6data,bkcol shr 16);
  531.           wrDACreg(dacTVP6index,$24);
  532.           wrDACreg(dacTVP6data,hi(bkcol));
  533.           wrDACreg(dacTVP6index,$25);
  534.           wrDACreg(dacTVP6data,lo(bkcol));
  535.           wrDACreg(dacTVP6index,$26);
  536.           wrDACreg(dacTVP6data,fgcol shr 16);
  537.           wrDACreg(dacTVP6index,$27);
  538.           wrDACreg(dacTVP6data,hi(fgcol));
  539.           wrDACreg(dacTVP6index,$28);
  540.           wrDACreg(dacTVP6data,lo(fgcol));
  541.         end;
  542.     end
  543.   else
  544.     case cv.chip of
  545.          __ARK:begin
  546.                  if (memmode=_P15) or (memmode=_P16) then
  547.                  begin
  548.                    fgcol:=rgb(fgcol shr 16,hi(fgcol),lo(fgcol));
  549.                    bkcol:=rgb(bkcol shr 16,hi(bkcol),lo(bkcol));
  550.                  end;
  551.                  wrinx(SEQ,$26,lo(fgcol));
  552.                  wrinx(SEQ,$27,hi(fgcol));
  553.                  wrinx(SEQ,$28,fgcol shr 16);
  554.                  wrinx(SEQ,$29,lo(bkcol));
  555.                  wrinx(SEQ,$2A,hi(bkcol));
  556.                  wrinx(SEQ,$2B,bkcol shr 16);
  557.                end;
  558.        __cir54:begin
  559.          modinx(SEQ,$12,3,2);
  560.          outp($3C8,$ff);
  561.          outp($3C9,lo(fgcol) shr 2);
  562.          outp($3C9,hi(fgcol) shr 2);
  563.          outp($3C9,fgcol shr 18);
  564.          outp($3C8,0);
  565.          outp($3C9,lo(bkcol) shr 2);
  566.          outp($3C9,hi(bkcol) shr 2);
  567.          outp($3C9,bkcol shr 18);
  568.          modinx(SEQ,$12,3,1);
  569.            end;
  570.       __Mach32:begin
  571.          outp($1AEE,lo(bkcol));
  572.          outp($1AEF,lo(fgcol));
  573.          if memmode>_p8 then
  574.          begin
  575.            outpw($3AEE,bkcol shr 8);
  576.            outpw($3EEE,fgcol shr 8);
  577.          end
  578.            end;
  579.       __Mach64:begin
  580.                  meml[cv.Xseg:$60]:=(fgcol shl 8)+lo(fgcol);
  581.                  meml[cv.Xseg:$64]:=(bkcol shl 8)+lo(bkcol);
  582.                end;
  583.       __S3:begin
  584.                {  wrinx(crtc,$38,$48); }
  585.          wrinx(crtc,$39,$A0);
  586.          if memmode>_p8 then
  587.          begin
  588.            if rdinx(crtc,$45)=0 then;
  589.            wrinx(crtc,$4A,fgc);
  590.            wrinx(crtc,$4A,fgc shr 8);
  591.            if memmode>=_p24 then wrinx(crtc,$4A,fgc shr 16);
  592.            if rdinx(crtc,$45)=0 then;
  593.            wrinx(crtc,$4B,bkc);
  594.            wrinx(crtc,$4B,bkc shr 8);
  595.            if memmode>=_p24 then wrinx(crtc,$4B,bkc shr 16);
  596.          end
  597.          else begin
  598.            wrinx(crtc,$E,fgcol);
  599.            wrinx(crtc,$F,bkcol);
  600.          end;
  601.          wrinx(crtc,$39,0);
  602.            end;
  603.          __SiS:begin
  604.                  wrinx3(SEQ,$14,fgcol);
  605.                  wrinx3(SEQ,$17,bkcol);
  606.                end;
  607.           __WD:begin
  608.          outp($23C0,2);
  609.                  outpw($23C2,$8000+lo(fgcol));
  610.          outp($23C0,1);
  611.                end;
  612.         __Oak,
  613.         __NCR,
  614.         __AGX,
  615.        __Tseng:(*if cv.version>=ET_4W32 then *)
  616.            begin
  617.          outp($3C8,$FF);
  618.          outp($3C9,lo(fgcol) shr 2);
  619.          outp($3C9,hi(fgcol) shr 2);
  620.          outp($3C9,fgcol shr 18);
  621.            end;
  622. (*     __AGX:;  *)
  623.    __xbe,__XGA:begin
  624.          wrinx3m(cv.IOadr+10,$38,fgcol);
  625.          wrinx3m(cv.IOadr+10,$3B,bkcol);
  626.            end;
  627.     end;
  628.   clearDACpage;
  629. end;
  630.  
  631. procedure HWcuronoff(on:boolean);
  632. begin
  633.   if dacHWcursor then
  634.     case cv.dactype of
  635.     _dacBt484,_dacBt485:
  636.         modreg(setDACpage(dacBTcmd2),3,2*ord(on));
  637.     _dacTVP3010,_dacTVP3020,_dacTVP3025:
  638.         begin
  639.           wrDACreg(dacTVPindex,6);
  640.           modDACreg(dacTVPdata,$40,$40*ord(on));
  641.         end;
  642.     _dacTVP3026:
  643.         begin
  644.           wrDACreg(dacTVP6index,6);
  645.           modDACreg(dacTVP6data,$40,$40*ord(on));
  646.         end;
  647.     end
  648.   else
  649.     case cv.chip of
  650.        __Alli:begin
  651.                if mem[SegA000:$D8]=0 then;
  652.                outpw(SEQ,$1210);
  653.                setinx(SEQ,$1C,8);
  654.                modinx(SEQ,$1B,7,1);
  655.  
  656.                mem[SegA000:$7940]:=ord(on);
  657.  
  658.                clrinx(SEQ,$1B,7);
  659.                clrinx(SEQ,$1C,8);
  660.               end;
  661.         __ARK:modinx(SEQ,$20,8,8*ord(on));
  662.      __Mach32:outp($EEF,$80*ord(on));
  663.      __Mach64:modreg($66EC,$80,$80*ord(on));
  664.         __oak:if cv.version>=OAK_083 then
  665.                 modinx($3DE,$4C,1,ord(on));
  666.      __S3:begin
  667.                { wrinx(crtc,$38,$48); }
  668.         wrinx(crtc,$39,$A0);
  669.         modinx(crtc,$45,3,2+ord(on));
  670.         wrinx(crtc,$39,0);
  671.           end;
  672.         __SiS:modinx(SEQ,6,$40,ord(on)*$40);
  673.        __Trid:modinx(crtc,$50,$80,ord(on)*$80);
  674.          __WD:begin
  675.         outp($23C0,2);
  676.         outpw($23C2,ord(on)*$800);
  677.           end;
  678.       __AGX,
  679.   __xbe,__xga:wrinx(cv.IOadr+10,$36,ord(on));
  680.      __Cirrus,
  681.      __Video7:modinx(SEQ,$A5,$80,ord(on)*$80);
  682.  
  683.     end;
  684.   clearDACpage;
  685. end;
  686.  
  687. procedure setHWcurpos(X,Y:word);
  688. var l:longint;
  689.   w:word;
  690. begin
  691.  
  692.   if extpixfact>1 then x:=x*extpixfact;
  693.   if extlinfact>1 then Y:=Y*extlinfact;
  694.   if dacHWcursor then
  695.     case cv.dactype of
  696.     _dacBt484,_dacBt485:
  697.         begin
  698.           inline($fa);
  699.           outpw(setDACpage(dacBTcurX),x+32);
  700.           outpw(setDACpage(dacBTcurY),y+32);
  701.           inline($fb);
  702.         end;
  703.     _dacTVP3010,_dacTVP3020,_dacTVP3025:
  704.         begin
  705.           wrDACreg(dacTVPindex,0);
  706.           wrDACreg(dacTVPdata,lo(x));
  707.           wrDACreg(dacTVPindex,1);
  708.           wrDACreg(dacTVPdata,hi(x));
  709.           wrDACreg(dacTVPindex,2);
  710.           wrDACreg(dacTVPdata,lo(y));
  711.           wrDACreg(dacTVPindex,3);
  712.           wrDACreg(dacTVPdata,hi(y));
  713.         end;
  714.     _dacTVP3026:
  715.         begin
  716.           wrDACreg(dacTVP6index,0);
  717.           wrDACreg(dacTVP6data,lo(x));
  718.           wrDACreg(dacTVP6index,1);
  719.           wrDACreg(dacTVP6data,hi(x));
  720.           wrDACreg(dacTVP6index,2);
  721.           wrDACreg(dacTVP6data,lo(y));
  722.           wrDACreg(dacTVP6index,3);
  723.           wrDACreg(dacTVP6data,hi(y));
  724.         end;
  725.     end
  726.   else
  727.     case cv.chip of
  728.      __ALG:if cv.version=ALG_2101 then
  729.            begin
  730.          if (rdinx(crtc,$19) and 1)=0 then y:=y*2;
  731.          if ((memmode=_P8) and ((rdinx(GRC,$C) and $10)=0))
  732.                    or (memmode>_P8)  then x:=x*2;
  733.          wrinx(crtc,$21,x shr 3);
  734.          wrinx(crtc,$23,y shr 1);
  735.          modinx(crtc,$25,$7f,((x and 7) shl 2) + (y shr 9)
  736.                 +((y and 1) shl 6) or $20);
  737.            end
  738.            else begin
  739.          clrinx(crtc,$1A,4);
  740.                  setinx(GRC,$F,$25);
  741.          outpw($82CA,x);
  742.          outpw($82CC,y);
  743.                  clrinx(GRC,$F,1);
  744.          setinx(crtc,$1A,$54);
  745.            end;
  746.        __Alli:begin
  747.                if mem[SegA000:$D8]=0 then;
  748.                outpw(SEQ,$1210);
  749.                setinx(SEQ,$1C,8);
  750.                modinx(SEQ,$1B,15,1);
  751.  
  752.                memw[SegA000:$7948]:=x;
  753.                memw[SegA000:$794A]:=y;
  754.  
  755.                clrinx(SEQ,$1B,7);
  756.                clrinx(SEQ,$1C,8);
  757.               end;
  758.          __ARK:begin
  759.                  wrinx2m(SEQ,$21,x);
  760.                  wrinx2m(SEQ,$23,y);
  761.                end;
  762.        __chips:if cv.version=CT_452 then
  763.            begin
  764.          wrinx2m(cv.IOadr,$33,x);
  765.          wrinx2m(cv.IOadr,$35,y);
  766.            end;
  767.        __CIR54:BEGIN
  768.          outpw(SEQ,(x shl 5) or $10);
  769.          outpw(SEQ,(y shl 5) or $11);
  770.            END;
  771.       __Mach32:begin
  772.          outpw($12EE,x);
  773.          outpw($16EE,y);
  774.            end;
  775.       __Mach64:begin
  776.                  memw[cv.Xseg:$6C]:=x;
  777.                  memw[cv.Xseg:$6E]:=y;
  778.                end;
  779.      __ncr:begin
  780.          wrinx2m(SEQ,$D,x);
  781.          wrinx2m(SEQ,$F,y);
  782.            end;
  783.          __Oak:if cv.Version>=OAK_083 then
  784.                begin
  785.                  wrinx2m($3DE,$40,x and $FFFC);
  786.                  wrinx2m($3DE,$42,y);
  787.                end;
  788.       __S3:begin
  789.                  if (curmode=$13) or (curmode=$D) then x:=x*2
  790.                  else if cv.version<S3_864 then
  791.                  begin
  792.                    if memmode>=_P24 then x:=x*3
  793.                    else if (memmode>=_P15) then x:=x*2;
  794.                  end
  795.                  else if (memmode>=_P32) and (cv.version<S3_732) then x:=x*2;
  796.          wrinx(crtc,$39,$A0);
  797.          wrinx2m(crtc,$46,x);
  798.          wrinx(crtc,$49,y);
  799.          wrinx(crtc,$48,y shr 8);  {this byte registers the new
  800.                         cursor position - must be last
  801.                                             byte written}
  802.          setinx(crtc,$45,1);
  803.          wrinx(crtc,$39,0);
  804.            end;
  805.          __SiS:begin
  806.                  wrinx2(SEQ,$1A,x);
  807.                  if (rdinx(SEQ,6) and $20)>0 then  {Interlace}
  808.                  begin
  809.                    if (y and 1)>0 then y:=y+$2000;
  810.                    y:=y shr 1;
  811.                  end;
  812.                  wrinx2(SEQ,$1D,y);
  813.                end;
  814.         __Trid:begin
  815.                  wrinx2(crtc,$40,x);
  816.                  wrinx2(crtc,$42,y);
  817.                end;
  818.        __Tseng:if cv.version>=ET_4W32 then
  819.            begin
  820.                  if cv.version<ET_4W32p_A then
  821.            case memmode of
  822.             _p15,_p16:x:=x*2;
  823.              _p24:x:=x*3;
  824.            end;
  825.                  if (cv.subvers>=$20) and (cv.subvers<$40) then
  826.                  begin
  827.                    repeat until (inp(crtc+6) and 2)>0;
  828.                    repeat w:=inp(crtc+6) until (w and 2)=0;
  829.                    wrinx2($217A,$E4,y);
  830.                    if (w and $40)=0 then
  831.                    begin
  832.                      outp($3BF,3);
  833.                      outp($3D8,$A0);
  834.                      modinx(crtc,$37,$40,$40);
  835.                      modinx(crtc,$37,$40,0);
  836.                      outp($3D8,$29);
  837.                      outp($3BF,1);
  838.                    end;
  839.                  end
  840.                  else wrinx2($217A,$E4,y);
  841.          wrinx2($217A,$E6,32);
  842.          wrinx2($217A,$E0,x);
  843.          wrinx2($217A,$E2,32);
  844.            end;
  845.     (* __AGX:if (inp(cv.IOadr) and 4)>0 then
  846.            begin
  847.          wrinx2(cv.IOadr+10,$30,x);
  848.          wrinx2(cv.IOadr+10,$33,y);
  849.            end; *)
  850.           __WD:begin
  851.          outp($23C0,2);
  852.          if cv.version=WD_90c33 then
  853.          begin
  854.            if (memmode=_p15) or (memmode=_p16) then
  855.              x:=(x*2) div 3;
  856.            outpw($23C2,$D000+x);
  857.            outpw($23C2,$E000+y);
  858.          end
  859.          else begin
  860.            case memmode of
  861.         _p15,_p16:x:=x*2;
  862.              _p24:x:=x*3;
  863.            end;
  864.            outpw($23C2,$6000+x);
  865.            outpw($23C2,$7000+y);
  866.          end;
  867.            end;
  868.       __Cirrus,
  869.       __Video7:begin
  870.          wrinx2m(SEQ,$9C,X);
  871.          wrinx2m(SEQ,$9E,Y);
  872.            end;
  873.    __AGX,__xbe,__XGA:begin
  874.          wrinx2(cv.IOadr+10,$30,x);
  875.          wrinx2(cv.IOadr+10,$33,y);
  876.            end;
  877.     end;
  878.   clearDACpage;
  879. end;
  880.  
  881.  
  882. const
  883.   S3accelmode:byte=0;   {0: unknown, 1: Accell, 2: Frame}
  884.  
  885.   {If possible sets up the mode for acceleration ad returns true, false if not}
  886. function S3accelON:boolean;
  887. begin
  888.   S3accelON:=true;
  889.   if (cv.version>S3_924) and (memmode>_PL4) then
  890.   begin
  891.     wrinx(crtc,$38,$48);
  892.     wrinx(crtc,$39,$A5);
  893.     clrinx(crtc,$58,$14);    {Disable Linear adr. & RAC}
  894.     modinx(crtc,$40,9,1);
  895.     clrinx(crtc,$53,$F);
  896.     wrinx(crtc,$54,$A0);
  897.     outpw($BEE8,$E000);
  898.     outpw($AAE8,$FFFF);   {Enable all planes - }
  899.     outpw($AEE8,$FFFF);
  900.     if memmode>=_p24 then
  901.     begin
  902.       outpw($BEE8,$E010);
  903.       outpw($AAE8,$FFFF);   {Enable all planes - }
  904.       outpw($AEE8,$FFFF);
  905.     end;
  906.     S3accelmode:=1;
  907.   end
  908.   else begin
  909.     wrinx(crtc,$38,$48);
  910.     wrinx(crtc,$39,$A5);
  911.     if (rdinx(crtc,$40) and 1)=0 then S3accelON:=false;
  912.     wrinx(crtc,$39,0);
  913.   end;
  914. end;
  915.  
  916.  
  917. procedure S3accelOFF;
  918. begin
  919.   if (cv.version>S3_924) and (memmode>_PL4) then
  920.   begin
  921.     wrinx(crtc,$38,$48);
  922.     wrinx(crtc,$39,$A5);
  923.     if (rdinx(crtc,$40) and 1)>0 then
  924.       repeat until (inpw($9AE8) and $200)=0;
  925.     clrinx(crtc,$40,1);
  926.     setinx(crtc,$40,8);
  927.     if (memmode>_pl4) and (curmode<>$13) then setinx(crtc,$58,$10);
  928.     wrinx(crtc,$39,$5A);
  929.     wrinx(crtc,$38,$00);
  930.     S3accelmode:=2;
  931.   end;
  932. end;
  933.  
  934.  
  935. procedure TridOutB(index,val:word);
  936. begin
  937.   outp(cv.IOadr,index);
  938.   outp(cv.IOadr+2,val);
  939. end;
  940.  
  941. procedure TridOutW(index,val:word);
  942. begin
  943.   outp(cv.IOadr,index);
  944.   outpw(cv.IOadr+2,val);
  945. end;
  946.  
  947. procedure TridOutL(index:word;val:longint);
  948. begin
  949.   outp(cv.IOadr,index);
  950.   outpw(cv.IOadr+2,val);
  951.   outpw(cv.IOadr+4,val shr 16);
  952. end;
  953.  
  954.  
  955.   (* Wait til ALG ready *)
  956. procedure ALG_wait;
  957. begin
  958.   if cv.version=ALG_2101 then
  959.     repeat until (inp($82AA) and $F)=0
  960.   else
  961.     repeat until (inp($82BA) and $80)=0;
  962. end;
  963.  
  964. procedure AL_DstCoor(xst,yst:word);
  965. var l:longint;
  966.     w:word;
  967. begin
  968.   l:=yst*longint(pixels)+xst;
  969.   ALG_wait;
  970.   if memmode>_p8 then
  971.   begin
  972.     l:=l*2;
  973.     outpw($828A,pixels*2);
  974.   end
  975.   else outpw($828A,pixels);
  976.   outpw($8286,l);
  977.   outp( $8288,l shr 16);
  978.   outpw($829C,xst);
  979.   outpw($829E,yst);
  980. end;
  981.  
  982. procedure AL_BlitArea(dx,dy:word);
  983. begin
  984.   if memmode>_p8 then dx:=dx*2;
  985.   outpw($828C,dx);
  986.   outpw($828E,dy);
  987. end;
  988.  
  989. procedure AL_SrcCoor(xst,yst:word);
  990. var l:longint;
  991.     w:word;
  992. begin
  993.   l:=yst*longint(pixels)+xst;
  994.   if memmode>_p8 then
  995.   begin
  996.     l:=l*2;
  997.     outpw($8284,pixels*2);
  998.   end
  999.   else outpw($8284,pixels);
  1000.   outpw($8280,l);
  1001.   outp( $8282,l shr 16);
  1002. end;
  1003.  
  1004. procedure WD_coor(index,x,y:word);
  1005. var l,b:longint;
  1006. begin
  1007.   b:=bytes;
  1008.   if memmode<=_pl4 then b:=b*8;
  1009.   case memmode of
  1010.   _p15,_p16:x:=x*2;
  1011.        _p24:x:=x*3;
  1012.   end;
  1013.   l:=b*y+x;
  1014.   WD_outl(index,l);
  1015. end;
  1016.  
  1017. procedure WD_DstCoor(X,Y,dx,dy:word);
  1018. var b:longint;
  1019. begin
  1020.   WD_coor($4000,X,Y);
  1021.   b:=bytes;
  1022.   if memmode<=_pl4 then b:=b*8;
  1023.   case memmode of
  1024.   _p15,_p16:dx:=dx*2;
  1025.        _p24:dx:=dx*3;
  1026.   end;
  1027.   outpw($23C2,$6000+dx);
  1028.   outpw($23C2,$7000+dy);
  1029.   outpw($23C2,$8000+b);
  1030. end;
  1031.  
  1032. procedure P2000_DstCoor(X,Y,dx,dy,dir:word);
  1033. var l:longint;
  1034. begin
  1035.   l:=longint(pixels)*y+x;
  1036.   if memmode>_p8 then
  1037.   begin
  1038.     dx:=dx*2;
  1039.     l:=l*2;
  1040.     wrinx2(GRC,$3A,pixels*2);
  1041.   end
  1042.   else wrinx2(GRC,$3A,pixels);
  1043.   if dir>0 then dy:=dy or $C000;
  1044.   wrinx2(GRC,$33,dx);
  1045.   wrinx3(GRC,$37,l);
  1046.   wrinx2(GRC,$35,dy);
  1047. end;
  1048.  
  1049. procedure P2000_SrcCoor(X,Y:word);
  1050. var l:longint;
  1051. begin
  1052.   l:=longint(pixels)*y+x;
  1053.   if memmode>_p8 then l:=l*2;
  1054.   if memmode=_pl4 then wrinx(GRC,5,0);  {set write mode 0}
  1055.   wrinx3(GRC,$30,l);
  1056.   wrinx2(GRC,$1E,pixels);
  1057. end;
  1058.  
  1059. procedure P2000_cmd(cmd:word);
  1060. begin
  1061.   wrinx(GRC,$3D,cmd);
  1062.   repeat until (rdinx(GRC,$3D) and 1)=0;
  1063.   wrinx(GRC,$3D,0);
  1064. end;
  1065.  
  1066. procedure S3_fill(xst,yst,dx,dy:integer;col:longint);
  1067. begin
  1068.   if (pixels>1024) and (memmode>=_p8) and
  1069.     (cv.Version>=S3_928) and (cv.Version<S3_864) then  {Argh...}
  1070.   begin
  1071.     yst:=yst*2;
  1072.     dy:=dy*2;
  1073.   end;
  1074.  
  1075.   repeat until (inp($9AE8) and $FF)=0;
  1076.   outpw($82E8,yst);
  1077.   outpw($86E8,Xst);
  1078.   outpw($96E8,dx);
  1079.   outpw($BEE8,$E000);
  1080.   outpw($A6E8,col);
  1081.   if (memmode>=_p24) then
  1082.   begin
  1083.     outpw($BEE8,$E010);
  1084.     outpw($A6E8,col shr 16);
  1085.   end;
  1086.   repeat until (inp($9AE8) and $FF)=0;
  1087.   outpw($BAE8,$27);
  1088.   outpw($BEE8,dy-1);
  1089.   outpw($BEE8,$A000);
  1090.   outpw($9AE8,$40F1);
  1091.   clrinx(crtc,$40,1);
  1092. end;
  1093.  
  1094. procedure fillrect(xst,yst,dx,dy:word;col:longint);
  1095. const
  1096.   masks:array[0..3] of byte=(0,7,3,1);
  1097.   maske:array[0..3] of byte=($F8,$FC,$FE,$FF);
  1098.   masks4:array[0..7] of byte=(0,$7F,$3F,$1F,$F,7,3,1);
  1099.   maske4:array[0..7] of byte=($80,$C0,$E0,$F0,$F8,$FC,$FE,$FF);
  1100. var w,w1:word;
  1101.     l:longint;
  1102. begin
  1103.   case cv.chip of
  1104.        __ALG:begin
  1105.            AL_DstCoor(xst,yst);
  1106.            AL_BlitArea(dx,dy);
  1107.            wrinx(GRC,$D,col);
  1108.            outp( $8290,7);
  1109.            outp( $8292,$D);
  1110.            outp( $82AA,1);
  1111.          end;
  1112.        __ARK:begin
  1113.                repeat until (inp($3CB) and $F)>=7;
  1114.                setinx(SEQ,$10,$1C);
  1115.                wrinx(SEQ,$13,$00);
  1116.                wrinx(SEQ,$14,$C0);
  1117.                memw[SegA800:$02]:=0;
  1118.                memw[SegA800:$08]:=col;
  1119.                memw[SegA800:$18]:=$300;
  1120.                memw[SegA800:$1A]:=$FFFF;
  1121.                meml[SegA800:$58]:=0;
  1122.                meml[SegA800:$5C]:=$FFFFFFFF;
  1123.                repeat until (inp($3CB) and $F)>=7;
  1124.                memw[SegA800:$70]:=Xst;
  1125.                memw[SegA800:$72]:=Yst;
  1126.                memw[SegA800:$74]:=dx;
  1127.                memw[SegA800:$76]:=dy;
  1128.                meml[SegA800:$7C]:=$20400000;
  1129.                clrinx(SEQ,$10,$1C);
  1130.              end;
  1131.     __compaq:begin
  1132.            case usebits[memmode] of
  1133.                   4:col:=(col and 15)*$11111111;
  1134.                   8:col:=lo(col)*$1010101;
  1135.               15,16:col:=(col and $FFFF)*$10001;
  1136.            end;
  1137.            repeat until (inp($33CE) and 1)=0;
  1138.            if (cv.Version=CPQ_AVGA) or (rdinx(GRC,$F)=$A5) then
  1139.            begin
  1140.          if memmode=_p8 then
  1141.          begin
  1142.            l:=(yst*bytes+xst) shr 2;
  1143.            w:=bytes shr 2;
  1144.            outp($33C0,masks[xst and 3]);
  1145.            outp($33C1,maske[((xst+dx-1) and 3)]);
  1146.            outp($33C8,(-dx) and 3);
  1147.            outp($33C9,masks[dx and 3]);
  1148.            if ((xst and 3)=0) and ((dx and 3)=0) then inc(dx,4);
  1149.            outpw($23C2,(dx +(xst and 3) +3) shr 2);
  1150.          end
  1151.          else begin
  1152.            l:=yst*bytes+(xst shr 3);
  1153.            w:=bytes;
  1154.            outp($33C0,masks4[xst and 7]);
  1155.            outp($33C1,maske4[(xst+dx-1) and 7]);
  1156.            outp($33C8,(-dx) and 7);
  1157.            outp($33C9,masks4[dx and 7]);
  1158.            if ((xst and 7)=0) and ((dx and 7)=0) then inc(dx,8);
  1159.            outpw($23C2,(dx +(xst and 7) +7) shr 3);
  1160.          end;
  1161.          outpw($23C0,l);
  1162.          outpw($23CA,w);
  1163.          outpw($23CC,w);
  1164.         { outpw($33C0,$ffff); }
  1165.          outp($33c7,$c);
  1166.         { outpw($33c8,0); }
  1167.          w:=(l shr 2) and $C000;
  1168.          w:=w or ((dy shl 4) and $3000);
  1169.          outpw($23C4,dy+w);
  1170.           {   if (xst and 3)>0 then inc(dx,4);
  1171.          if ((xst+dx-1) and 3)>0 then inc(dx,4); }
  1172.          outp($33CF,$30);
  1173.            end
  1174.            else begin
  1175.          outpw($63CC,xst);
  1176.          outpw($63CE,yst);
  1177.          outpw($23C2,dx);
  1178.          outpw($23C4,dy);
  1179.          outp($33CF,$C0);
  1180.          wrinx(GRC,$5A,2);
  1181.            end;
  1182.            outpw($33CA,col);
  1183.            outpw($33CA,col);
  1184.            outpw($33CC,col shr 16);
  1185.            outpw($33CC,col shr 16);
  1186.            outp($33CE,9);
  1187.          end;
  1188.      __cir54:begin
  1189.            repeat until (rdinx(GRC,$31) and 1)=0;
  1190.            case memmode of
  1191.          _p15,_p16:w:=2;
  1192.           _p24:w:=3;
  1193.            else w:=1;
  1194.            end;
  1195.                wrinx(GRC,1,col);
  1196.                wrinx(GRC,$11,hi(col));
  1197.            wrinx2(GRC,$20,dx*w);
  1198.            wrinx2(GRC,$22,dy);
  1199.            wrinx3(GRC,$28,Yst*bytes+Xst*w);
  1200.            wrinx3(GRC,$2C,cv.mm*longint(1024)-8);
  1201.                modinx(GRC,$30,$CF,$C0);   {PatternCopy + Color Expand}
  1202.            wrinx(GRC,$32,$D);
  1203.            wrinx(GRC,$31,2);
  1204.          end;
  1205.     __Mach32:begin
  1206.                repeat until inpw($9AEE)=0;
  1207.                outpw($A6E8,col);
  1208.                outpw($BAEE,7);
  1209.                outpw($CEEE,$3391);
  1210.                outpw($82E8,yst);
  1211.                outpw($86E8,xst);
  1212.                outpw($A6EE,xst);
  1213.                outpw($AAEE,xst+dx);
  1214.                outpw($AEEE,yst+dy);
  1215.              end;
  1216.     __Mach64:begin
  1217.                repeat until (mem[cv.Xseg:$338] and 1)=0;
  1218.                repeat until memw[cv.Xseg:$310]=0;
  1219.                write32($2C4,col);         {Fill color}
  1220.                write32($2D4,$70003);      {}
  1221.                write32($2C8,$FFFFFFFF);   {Write mask}
  1222.                write32($2D8,$100);        {}
  1223.                write32($130,3);           {Dest Cntl}
  1224.  
  1225.                write32w($10C,xst,yst);    {Dest start X,Y}
  1226.                write32w($118,dy,dx);      {Size}
  1227.              end;
  1228.        __NCR:begin
  1229.                repeat until (mem[cv.Xseg:$32] and 1)=1;
  1230.                write32($50,col);
  1231.                write32($4C,col);
  1232.                write32($48,0);
  1233.                write32($44,0);
  1234.                write32($40,pixeladdress(Xst,Yst));
  1235.                write32w($3C,dy,dx);
  1236.                write32($38,$cc0000);
  1237.                write32($34,$C8C0); {Color Expand, Down&Right}
  1238.                write32($30,1);    {Start}
  1239.              end;
  1240.      __P2000:begin
  1241.            wrinx(GRC,$3E,col);
  1242.            P2000_DstCoor(xst,yst,dx,dy,0);
  1243.            P2000_cmd($19);
  1244.          end;
  1245.     __S3:if S3accelON then
  1246.              begin
  1247.            S3_fill(xst,yst,dx,dy,col);
  1248.            if (memmode>_p8) and (cv.version<=S3_924) then
  1249.          S3_fill(xst+1024,yst,dx,dy,hi(col));
  1250.            S3accelOFF;
  1251.          end;
  1252.        __SiS:begin
  1253.                setinx(SEQ,$B,1);
  1254.                while (mem[SegA000:$82AB] and $80)>0 do;
  1255.                meml[SegA000:$8284]:=xst*bytes+yst;
  1256.                memw[SegA000:$828A]:=bytes;
  1257.                memw[SegA000:$828C]:=8;
  1258.                memw[SegA000:$828E]:=4;
  1259.                mem [SegA000:$8290]:=col;
  1260.                mem [SegA000:$8293]:=$F0;
  1261.                memw[SegA000:$82AA]:=$30;
  1262.                clrinx(SEQ,$B,1);
  1263.              end;
  1264.       __Trid:if cv.Version>=TR_9200CXr then
  1265.              begin
  1266.              while (mem [$BFF0:$20] and $20)>0 do;
  1267.                mem [$BFF0:$27]:=$F0;
  1268.                memw[$BFF0:$2C]:=col;
  1269.                memw[$BFF0:$30]:=col;
  1270.                memw[$BFF0:$38]:=Xst;
  1271.                memw[$BFF0:$3A]:=Yst;
  1272.                memw[$BFF0:$40]:=dx-1;
  1273.                memw[$BFF0:$42]:=dy-1;
  1274.                memw[$BFF0:$28]:=$4000;
  1275.                mem [$BFF0:$24]:=1;
  1276.  
  1277.              end;
  1278.      __Tseng:if cv.version>=ET_4W32 then
  1279.          begin
  1280.                case colbits[memmode] of
  1281.                    8:l:=col*$1010101;
  1282.                15,16:begin
  1283.                        l:=col*$10001;
  1284.                        dx:=dx*2;
  1285.                        Xst:=Xst*2;
  1286.                      end;
  1287.                   24:begin
  1288.                        l:=col*$1000001;{Bug!!}
  1289.                        dx:=dx*3;
  1290.                        Xst:=Xst*3;
  1291.                      end;
  1292.                   32:begin
  1293.                        l:=col;
  1294.                        dx:=dx*4;
  1295.                        Xst:=Xst*4;
  1296.                      end;
  1297.                end;
  1298.                write32(0,l);write32(4,l);
  1299.                {memL[cv.xseg:0]:=l;  {Fill Color}
  1300.              {  write32($7F80,cv.mm*longint(1024)-8);
  1301.                {meml[cv.xseg:$7F80]:=cv.mm*longint(1024)-4;    {Pattern/Color Data}
  1302.            mem [cv.xseg:$7F8F]:=0;    {Direction}
  1303.            memw[cv.xseg:$7F98]:=dx-1;
  1304.            memw[cv.xseg:$7F9A]:=dy-1;
  1305.            mem [cv.xseg:$7F9C]:=0;
  1306.            mem [cv.xseg:$7F9F]:=$F0;
  1307.                write32($7FA0,Yst*bytes+Xst);
  1308.            {meml[cv.xseg:$7FA0]:=Yst*bytes+Xst;}
  1309.                if cv.version<ET_4W32p_a then mem [cv.xseg:$7F31]:=9;
  1310.  
  1311.          end;
  1312.         __WD:if cv.Version=WD_90c33 then
  1313.              begin
  1314.            WD_wait;
  1315.            outp($23C0,3);
  1316.                outpw($23C2,$2000+lo(col));
  1317.                outpw($23C2,$3000+hi(col));
  1318.            outp($23C0,1);
  1319.                outpw($23C2,$4000+xst);
  1320.                outpw($23C2,$5000+yst);
  1321.            outpw($23C2,$6000+dx-1);
  1322.            outpw($23C2,$7000+dy-1);
  1323.            outpw($23C2,$8300);
  1324.            outpw($23C2,$210);
  1325.              end
  1326.              else begin {c24,c31}
  1327.            outp($23C0,1);
  1328.            outpw($23C2,$1000);
  1329.            outpw($23C2,$E0FF);
  1330.            outpw($23C2,$9300);
  1331.            outpw($23C2,$A000+col);
  1332.         {   outpw($23C2,$2000);
  1333.            outpw($23C2,$3000); }
  1334.            if (memmode<=_pl4) and ((xst and 7)+dx=10) then
  1335.            begin
  1336.          w1:=1;
  1337.          dec(dx);
  1338.            end else w1:=0;
  1339.  
  1340.            WD_DstCoor(xst,yst,dx,dy);
  1341.            if cv.version=WD_90c33 then w:=$208 else w:=$808;
  1342.            if memmode>_pl4 then w:=w+$100;
  1343.            outpw($23C2,w);
  1344.            WD_wait;
  1345.            if w1>0 then
  1346.            begin
  1347.          WD_DstCoor(xst+dx-1,yst,1,dy);
  1348.         { if cv.version=WD_90c33 then w:=$208 else} w:=$808;
  1349.          if memmode>_pl4 then w:=w+$100;
  1350.          outpw($23C2,w);
  1351.          WD_wait;
  1352.            end;
  1353.          end;
  1354.         __AGX,__xbe,__xga:
  1355.              begin
  1356.            repeat until (mem[cv.xseg:$11] and $80)=0;
  1357.            mem [cv.xseg:$12]:=1;
  1358.            mem [cv.xseg:$48]:=3;     {Always Src}
  1359.            meml[cv.xseg:$58]:=col;
  1360.            memw[cv.xseg:$78]:=xst;
  1361.            memw[cv.xseg:$7A]:=yst;
  1362.            memw[cv.xseg:$60]:=dx-1;
  1363.            memw[cv.xseg:$62]:=dy-1;
  1364.            meml[cv.xseg:$7C]:=$8118000;   {Cmd (Bitblt)}
  1365.          end;
  1366.   end;
  1367. end;
  1368.  
  1369. procedure S3_copy(srcX,srcY,dstX,dstY,dx,dy,dir:word);
  1370. begin
  1371.   if (pixels>1024) and (memmode>=_p8) and
  1372.     (cv.Version>=S3_928) and (cv.Version<S3_864) then  {Argh...}
  1373.   begin
  1374.     srcY:=srcY*2;
  1375.     dstY:=dstY*2;
  1376.     dY:=dY*2;
  1377.   end;
  1378.  
  1379.   repeat until (inp($9AE8) and $FF)=0;
  1380.   outpw($BAE8,$67);
  1381.   outpw($BEE8,$A000);
  1382.   outpw($86E8,SrcX);
  1383.   outpw($82E8,SrcY);
  1384.   outpw($8EE8,DstX);
  1385.   outpw($8AE8,DstY);
  1386.  
  1387.   outpw($96E8,dx-1);
  1388.   outpw($BEE8,dy-1);
  1389.   repeat until (inp($9AE8) and $FF)=0;
  1390.  { outpw($BEE8,$E040); }
  1391.   if dir<>0 then outpw($9AE8,$C013)
  1392.             else outpw($9AE8,$C0F3);
  1393. end;
  1394.  
  1395. procedure copyrect(srcX,srcY,dstX,dstY,dx,dy:word);
  1396. var l:longint;
  1397.     w,dir:word;
  1398.     i1,i2:integer;
  1399. begin
  1400.   if (DstY<SrcY) or ((SrcY=DstY) and (DstX<SrcX)) then dir:=0
  1401.   else begin
  1402.     dir:=1;
  1403.     SrcX:=SrcX+dx-1;
  1404.     SrcY:=SrcY+dy-1;
  1405.     DstX:=DstX+dx-1;
  1406.     DstY:=DstY+dy-1;
  1407.   end;
  1408.   case cv.chip of
  1409.        __ALG:begin
  1410.                if dir>0 then
  1411.                begin
  1412.                  SrcX:=SrcX-dx+1;
  1413.                  DstX:=DstX-dx+1;
  1414.                end;
  1415.            AL_DstCoor(DstX,DstY);
  1416.            AL_BlitArea(dx,dy);
  1417.            AL_SrcCoor(SrcX,SrcY);
  1418.                w:=7;
  1419.                if dir>0 then w:=1;
  1420.            outp( $8290,w);
  1421.            outpw($8292,w);
  1422.            outp( $82AA,2);
  1423.          end;
  1424.     __compaq:begin
  1425.            repeat until (inp($33CE) and 1)=0;
  1426.            if (cv.Version=CPQ_AVGA) or (rdinx(GRC,$F)=$A5) then   {AVGA}
  1427.            begin
  1428.          l :=srcy*bytes+srcx;
  1429.          w:=256;
  1430.          if (dir>0) then w:=$FF00;
  1431.         {     begin
  1432.            l:=l+(dy-1)*bytes+(dx-1);
  1433.            w:=$ff00;
  1434.          end; }
  1435.          i1:=dsty-srcy;
  1436.          i2:=dstx-srcx;
  1437.          outpw($23C0,l shr 2);
  1438.          outpw($23CC,lo(i1)*256+lo(i2 shr 2));
  1439.          outp($23C2,dx shr 2);
  1440.          outpw($23CA,w{bytes shr 2});
  1441.          outpw($33C0,$FFFF);
  1442.          outp($33C7,$C);
  1443.          outpw($33C8,0);
  1444.          w:=(w and $C00) or ((l shr 4) and $C000);
  1445.          w:=w or ((i1 shl 4) and $3000);
  1446.          outpw($23C4,dy+w);
  1447.          outp($33CF,$30);
  1448.            end
  1449.            else begin            {QVision}
  1450.          outpw($63CC,DstX);
  1451.          outpw($63CE,DstY);
  1452.          outpw($63C0,SrcX);
  1453.          outpw($63C2,SrcY);
  1454.          outpw($23C2,dx);
  1455.          outpw($23C4,dy);
  1456.          outpw($23CC,bytes shr 2);
  1457.          outp($33CF,$C0);
  1458.          wrinx(GRC,$5A,1);
  1459.            end;
  1460.            outp($33CE,$11+(dir shl 6));
  1461.          end;
  1462.      __cir54:begin
  1463.            repeat until (rdinx(GRC,$31) and 1)=0;
  1464.            case memmode of
  1465.          _p15,_p16:w:=2;
  1466.           _p24:w:=3;
  1467.            else w:=1;
  1468.            end;
  1469.            wrinx2(GRC,$20,dx*w);
  1470.            wrinx2(GRC,$22,dy);
  1471.            wrinx3(GRC,$28,dstY*bytes+dstX*w);
  1472.            wrinx3(GRC,$2C,srcY*bytes+srcX*w);
  1473.            wrinx (GRC,$32,$D);
  1474.                modinx(GRC,$30,$CF,dir);
  1475.            wrinx (GRC,$31,2);
  1476.          end;
  1477.     __Mach32:begin
  1478.                repeat until inpw($9AEE)=0;
  1479.                outpw($BAEE,$7);
  1480.                outpw($CEEE,$7391);
  1481.                outpw($8EE8,SrcX);
  1482.                outpw($8AE8,SrcY);
  1483.                outpw($B2EE,SrcX);
  1484.                outpw($82E8,DstY);
  1485.                outpw($86E8,DstX);
  1486.                outpw($A6EE,DstX);
  1487.                if dir=0 then
  1488.                begin
  1489.                  outpw($C2EE,1);
  1490.                  outpw($BEEE,SrcX+dx);
  1491.                  outpw($AAEE,DstX+dx);
  1492.                  outpw($AEEE,DstY+dy);
  1493.                end
  1494.                else begin
  1495.                  outpw($C2EE,0);
  1496.                  outpw($BEEE,SrcX-dx);
  1497.                  outpw($AAEE,DstX-dx);
  1498.                  outpw($AEEE,DstY-dy);
  1499.                end;
  1500.              end;
  1501.     __Mach64:begin
  1502.                repeat until (mem[cv.Xseg:$338] and 1)=0;
  1503.                repeat until memw[cv.Xseg:$310]=0;
  1504.                write32($2D4,$70003);      {}
  1505.                write32($2C8,$FFFFFFFF);   {Write mask}
  1506.                write32($2D8,$300);        {}
  1507.                write32($1B4,0);           {Src Cntl}
  1508.  
  1509.                write32w($18C,SrcX,SrcY);  {Src start X,Y}
  1510.                write32($190,dy);          {Src width1}
  1511.                if dir=0 then w:=3 else w:=0;
  1512.                write32($130,w);           {Dest Cntl}
  1513.                write32w($10C,DstX,DstY);  {Dest start X,Y}
  1514.                write32w($118,dy,dx);      {Size}
  1515.              end;
  1516.        __NCR:begin
  1517.                repeat until (mem[cv.Xseg:$32] and 1)=1;
  1518.                write32($44,pixeladdress(SrcX,SrcY));
  1519.                write32($40,pixeladdress(DstX,DstY));
  1520.                write32w($3C,dy,dx);
  1521.                write32($38,$CC0000);
  1522.                w:=$C0C0;
  1523.                if dir>0 then w:=$C000;
  1524.                write32($34,w);    {Copy, Down&Right}
  1525.                write32($30,1);    {Start}
  1526.              end;
  1527.      __P2000:begin
  1528.                if dir>0 then
  1529.                begin
  1530.                  SrcX:=SrcX-dx+1;
  1531.                  DstX:=DstX-dx+1;
  1532.                end;
  1533.            P2000_SrcCoor(SrcX,SrcY);
  1534.            P2000_DstCoor(DstX,DstY,dx,dy,dir);
  1535.            P2000_Cmd(5);
  1536.          end;
  1537.         __WD:if cv.Version=WD_90c33 then
  1538.              begin
  1539.            WD_wait;
  1540.            outp($23C0,1);
  1541.                outpw($23C2,$2000+SrcX);
  1542.                outpw($23C2,$3000+SrcY);
  1543.                outpw($23C2,$4000+DstX);
  1544.                outpw($23C2,$5000+DstY);
  1545.            outpw($23C2,$6000+dx-1);
  1546.            outpw($23C2,$7000+dy-1);
  1547.            outpw($23C2,$8300);
  1548.                if dir>0 then w:=$380 else w:=$200;
  1549.            outpw($23C2,w);
  1550.              end
  1551.              else begin
  1552.            WD_wait;
  1553.            outpw($23C2,$1000);
  1554.            outpw($23C2,$E0FF);
  1555.            WD_DstCoor(DstX,DstY,dx,dy);
  1556.            WD_Coor($2000,SrcX,SrcY);
  1557.            outpw($23C2,$9300);
  1558.            w:=$800;
  1559.            if memmode>_pl4 then w:=w+$100;
  1560.            if dir>0 then w:=w+$400;
  1561.            outpw($23C2,w);
  1562.            WD_wait;
  1563.          end;
  1564.     __S3:if S3accelON then
  1565.          begin
  1566.            S3_copy(SrcX,SrcY,DstX,DstY,dx,dy,dir);
  1567.            if (memmode>_p8) and (cv.version<=S3_924) then
  1568.          S3_copy(SrcX+1024,SrcY,DstX+1024,DstY,dx,dy,dir);
  1569.            S3accelOFF;
  1570.          end;
  1571.       __Trid:if cv.Version>=TR_9200CXr then
  1572.              begin
  1573.                while (mem [$BFF0:$20] and $20)>0 do;
  1574.                mem [$BFF0:$27]:=$CC;
  1575.                memw[$BFF0:$38]:=DstX;
  1576.                memw[$BFF0:$3A]:=DstY;
  1577.                memw[$BFF0:$3C]:=SrcX;
  1578.                memw[$BFF0:$3E]:=SrcY;
  1579.                memw[$BFF0:$40]:=dx-1;
  1580.                memw[$BFF0:$42]:=dy-1;
  1581.                memw[$BFF0:$28]:=0;
  1582.                mem [$BFF0:$24]:=1;
  1583.              end;
  1584.      __Tseng:if cv.version>=ET_4W32 then
  1585.          begin
  1586.                case colbits[memmode] of
  1587.                  15,16:begin
  1588.                          dx:=dx*2;
  1589.                          SrcX:=SrcX*2;
  1590.                          DstX:=DstX*2;
  1591.                        end;
  1592.                     24:begin
  1593.                          dx:=dx*3;
  1594.                          SrcX:=SrcX*3;
  1595.                          DstX:=DstX*3;
  1596.                        end;
  1597.                     32:begin
  1598.                          dx:=dx*4;
  1599.                          SrcX:=SrcX*4;
  1600.                          DstX:=DstX*4;
  1601.                        end;
  1602.                end;
  1603.            mem [cv.xseg:$7F9F]:=$CC;      {Copy}
  1604.            mem [cv.xseg:$7F8F]:=3*dir;    {Direction}
  1605.            mem [cv.xseg:$7F9C]:=0;
  1606.            memw[cv.xseg:$7F98]:=dx-1;
  1607.            memw[cv.xseg:$7F9A]:=dy-1;
  1608.                write32($7F84,SrcY*bytes+SrcX);
  1609.                write32($7FA0,DstY*bytes+DstX);
  1610.                if cv.version<ET_4W32p_a then mem[cv.xseg:$7F31]:=9;
  1611.          end;
  1612.        __AGX,__xbe,__xga:
  1613.              begin
  1614.            repeat until (mem[cv.xseg:$11] and $80)=0;
  1615.            mem [cv.xseg:$48]:=3;
  1616.            memw[cv.xseg:$70]:=SrcX;
  1617.            memw[cv.xseg:$72]:=SrcY;
  1618.            memw[cv.xseg:$78]:=DstX;
  1619.            memw[cv.xseg:$7A]:=DstY;
  1620.            memw[cv.xseg:$60]:=dx-1;
  1621.            memw[cv.xseg:$62]:=dy-1;
  1622.  
  1623.                l:=$28118000;
  1624.                if dir>0 then inc(l,6);
  1625.            meml[cv.xseg:$7C]:=l;    {BitBlt cmd}
  1626.          end;
  1627.   end;
  1628. end;
  1629.  
  1630. procedure swp(var i,j:integer);
  1631. var z:integer;
  1632. begin
  1633.   z:=i;
  1634.   i:=j;
  1635.   j:=z;
  1636. end;
  1637.  
  1638. procedure S3_line(x0,y0,x1,y1:integer;col:longint);
  1639. var w,z:word;
  1640. begin
  1641.   if (pixels>1024) and (memmode>=_p8) and
  1642.     (cv.Version>=S3_928) and (cv.Version<S3_864) then  {Argh...}
  1643.   begin       {urgh! - is there a better way?}
  1644.     y0:=y0*2;
  1645.     y1:=y1*2;
  1646.   end;
  1647.   repeat until (inp($9AE8) and $FF)=0;
  1648.   outpw($82E8,Y0);
  1649.   outpw($86E8,X0);
  1650.   w:=0;z:=0;
  1651.   x1:=x1-x0;
  1652.   if x1<0 then
  1653.   begin
  1654.     x1:=-x1;
  1655.     w:=w or $20;
  1656.     z:=1;
  1657.   end;
  1658.   y1:=y1-y0;
  1659.   if y1<0 then
  1660.   begin
  1661.     y1:=-y1;
  1662.     w:=w or $80;
  1663.   end;
  1664.   if x1<y1 then
  1665.   begin
  1666.     swp(x1,y1);
  1667.     w:=w or $40;
  1668.   end;
  1669.   outpw($8AE8,2*y1);
  1670.   outpw($8EE8,2*(y1-x1));
  1671.   outpw($92E8,2*y1-x1-z);
  1672.   outpw($96E8,x1);
  1673.   outpw($BEE8,$E000);
  1674.   outpw($A6E8,col);
  1675.   repeat until (inp($9AE8) and $FF)=0;
  1676.   if (memmode>_p16) then
  1677.   begin
  1678.     outpw($BEE8,$E010);
  1679.     outpw($A6E8,col shr 16);
  1680.   end;
  1681.   outpw($BAE8,$27);
  1682.   outpw($BEE8,$A000);
  1683.   outpw($9AE8,$2017+w);
  1684. end;
  1685.  
  1686.  
  1687. procedure line(x0,y0,x1,y1:integer;col:longint);
  1688. var l:longint;
  1689.   z,w:word;
  1690.   dx,dy,mi,ma:integer;
  1691. begin
  1692.   case cv.chip of
  1693.        __ALG:begin
  1694.            AL_DstCoor(x0,y0);
  1695.            wrinx(GRC,$D,col);
  1696.            outpw($82A8,$FFFF);
  1697.            w:=0;
  1698.            x1:=x1-x0;
  1699.            if x1<0 then
  1700.            begin
  1701.          x1:=-x1;
  1702.          w:=w or $100;
  1703.            end;
  1704.            if memmode>_p8 then x1:=x1*2;
  1705.            y1:=y1-y0;
  1706.            if y1<0 then
  1707.            begin
  1708.          y1:=-y1;
  1709.          w:=w or $200;
  1710.            end;
  1711.            if x1<y1 then
  1712.            begin
  1713.          swp(x1,y1);
  1714.          w:=w or $400;
  1715.            end;
  1716.            outpw($82A2,2*y1);
  1717.            outpw($82A6,2*y1-x1);
  1718.            outpw($82A4,2*(y1-x1));
  1719.            outpw($828E,x1+1);
  1720.            outpw($8292,$80D+w);
  1721.            outp ($8290,0);
  1722.            outp ($82AA,8);
  1723.          end;
  1724.     __Mach32:begin
  1725.                repeat until inpw($9AEE)=0;
  1726.                outpw($A6E8,col);
  1727.                outpw($A2EE,0);
  1728.             {   outpw($BEE8,$A000); }
  1729.                outpw($BAE8,$27);
  1730.               { outp ($B6E8,$27); }
  1731.                outpw($9AEE,0);
  1732.                outpw($FEEE,x0);    {Start}
  1733.                outpw($FEEE,y0);
  1734.                outpw($FEEE,x1);    {Stop}
  1735.                outpw($FEEE,y1);
  1736.              end;
  1737.     __Mach64:begin
  1738.                repeat until memw[cv.Xseg:$310]=0;
  1739.                write32($2C4,col);          {Fg Color}
  1740.                write32($2D4,$70003);
  1741.                write32($2C8,$FFFFFFFF);    {Write mask}
  1742.                write32($2D8,$100);
  1743.                write32w($2A8,pixels-1,0);  {Clip left/right}
  1744.                write32w($2B4,lins-1,0);    {Clip top/bot}
  1745.  
  1746.  
  1747.            dx:=abs(x0-x1);
  1748.            dy:=abs(y0-y1);
  1749.            mi:=dx;
  1750.            ma:=dy;
  1751.            if mi>ma then swp(mi,ma);
  1752.                write32w($10C,x0,y0);
  1753.                if x1>x0 then w:=1 else w:=0;
  1754.                if y0<y1 then inc(w,2);
  1755.                if dx<dy then inc(w,4);
  1756.                write32($130,w);
  1757.                write32($124,2*mi-ma);
  1758.                write32($128,2*mi);
  1759.                write32($12C,2*(mi-ma));
  1760.                write32($120,ma+1);
  1761.  
  1762.              (*  case memmode of
  1763.                 _PK4:l:=$10101;
  1764.             _P8,_P24:l:=$20202;
  1765.                 _P15:l:=$30303;
  1766.                 _P16:l:=$40404;
  1767.                 _P32:l:=$60606;
  1768.                end;
  1769.                meml[cv.Xseg:$2D0]:=l;    {Pixel Width}
  1770.                meml[cv.Xseg:$308]:=0;           {Color Cmp off}
  1771.                meml[cv.Xseg:$330]:=3;           {GUI trajetory}
  1772.  
  1773.                repeat until memw[cv.Xseg:$310]=0;
  1774.  
  1775.                meml[cv.Xseg:$100]:=(pixels shr 3) shl 22;   {} *)
  1776.  
  1777.  
  1778.                l:=meml[cv.Xseg:$310];
  1779.  
  1780.              end;
  1781.         __WD:if cv.Version=WD_90c33 then
  1782.              begin
  1783.            WD_wait;
  1784.            dx:=abs(x0-x1);
  1785.            dy:=abs(y0-y1);
  1786.            mi:=dx;
  1787.            ma:=dy;
  1788.            if mi>ma then swp(mi,ma);
  1789.            outpw($23C8,2*mi);
  1790.            outpw($23CA,2*(mi-ma));
  1791.            if x0>x1 then inc(ma);
  1792.            outpw($23CC,2*mi-ma);
  1793.            outp($23C0,3);
  1794.                outpw($23C2,$2000+lo(col));
  1795.                outpw($23C2,$3000+hi(col));
  1796.            outp($23C0,1);
  1797.            WD_wait;
  1798.                outpw($23C2,$4000+x0);
  1799.                outpw($23C2,$5000+y0);
  1800.            outpw($23C2,$6000+ma);
  1801.            outpw($23C2,$8300);
  1802.                w:=$810;
  1803.                if x0>x1 then w:=w+$100;
  1804.                if y0>y1 then w:=w+$80;
  1805.                if dx<dy then w:=w+$40;
  1806.            outpw($23C2,w);
  1807.                w:=w;
  1808.              end
  1809.              else begin
  1810.            WD_wait;
  1811.            dx:=abs(x0-x1);
  1812.            dy:=abs(y0-y1);
  1813.            mi:=dx;
  1814.            ma:=dy;
  1815.            if mi>ma then swp(mi,ma);
  1816.            outpw($23C2,$4000+x0);
  1817.            outpw($23C2,$5000+y0);
  1818.            outpw($23C2,$6000+dx);
  1819.            outpw($23C2,$7000+dy);
  1820.            outpw($23C2,$9300);
  1821.            outpw($23C2,$A000+lo(col));
  1822.            outpw($23C8,2*mi);
  1823.            outpw($23CA,2*(mi-ma));
  1824.            if x0>x1 then inc(ma);
  1825.            outpw($23CC,2*mi-ma);
  1826.            w:=$1800;
  1827.           { if x0>x1 then inc(w,$100); }
  1828.            if y0>y1 then inc(w,$100);
  1829.            if dx>dy then inc(w,$200);
  1830.            outpw($23C2,w);
  1831.            outpw($23C2,$910);
  1832.            WD_wait;
  1833.          end;
  1834.     __S3:if S3accelON then
  1835.          begin
  1836.            S3_line(x0,y0,x1,y1,col);
  1837.            if (memmode>_p8) and (cv.Version<=S3_924) then
  1838.          S3_line(x0+1024,y0,x1+1024,y1,hi(col));
  1839.            S3accelOFF;
  1840.          end;
  1841.      __Tseng:if (cv.version>=ET_4W32) {and (x0<>x1) and (y0<>y1)} then
  1842.          begin
  1843.                case colbits[memmode] of
  1844.                    8:l:=col*$1010101;
  1845.                15,16:begin
  1846.                        l:=col*$10001;
  1847.                        X0:=X0*2;
  1848.                        X1:=X1*2;
  1849.                      end;
  1850.                   24:begin
  1851.                        l:=col*$1000001;{Bug!!}
  1852.                        X0:=X0*3;
  1853.                        X1:=X1*3;
  1854.                      end;
  1855.                   32:begin
  1856.                        l:=col;
  1857.                        X1:=X1*4;
  1858.                        X0:=X0*4;
  1859.                      end;
  1860.                end;
  1861.                write32(0,l);
  1862.                {memL[cv.xseg:0]:=l;  {Fill Color}
  1863.                write32(4,l);
  1864.                {memL[cv.xseg:4]:=l;  {Fill Color}
  1865.                l:=cv.mm*longint(1024)-4;    {Pattern/Color Data}
  1866.                w:=0;
  1867.                y1:=y1-y0;
  1868.                x1:=x1-x0;
  1869.                if y1=0 then
  1870.                begin
  1871.                  if x1<0 then
  1872.                  begin
  1873.                    x1:=-x1;
  1874.                    inc(x0);
  1875.                  end;
  1876.                  dx:=x1-1;
  1877.                  dy:=0;
  1878.                end
  1879.                else if x1=0 then
  1880.                begin
  1881.                  if Y1<0 then
  1882.                  begin
  1883.                    Y1:=-Y1;
  1884.                    inc(Y0);
  1885.                  end;
  1886.                  dx:=0;
  1887.                  dy:=y1-1;
  1888.                end
  1889.                else begin
  1890.                  w:=$80;
  1891.                  if Y1<0 then
  1892.                  begin
  1893.                    Y1:=-Y1;
  1894.                    w:=w or $12;
  1895.                  end;
  1896.                  if x1<0 then
  1897.                  begin
  1898.                    x1:=-X1;
  1899.                    w:=w or 1;
  1900.                    inc(l,3);
  1901.                  end;
  1902.                  if X1<Y1 then
  1903.                  begin
  1904.                    z :=X1;
  1905.                    X1:=Y1;
  1906.                    Y1:=z;
  1907.                    w:=w or 4;
  1908.                    dx:=Y1-1;
  1909.                    dy:=$FFF;
  1910.                  end
  1911.                  else begin
  1912.                    dx:=$FFF;
  1913.                    dy:=Y1-1;
  1914.                  end;
  1915.              memw[cv.xseg:$7FAC]:=X1;
  1916.              memw[cv.xseg:$7FAE]:=Y1;
  1917.                end;
  1918.                write32($7F80,l);
  1919.                {meml[cv.xseg:$7F80]:=l;    {Pattern/Color Data}
  1920.            mem [cv.xseg:$7F8F]:=w;    {Direction}
  1921.                mem [cv.xseg:$7F9C]:=0;
  1922.                mem [cv.xseg:$7F9F]:=$F0;
  1923.            memw[cv.xseg:$7F98]:=dx;
  1924.            memw[cv.xseg:$7F9A]:=dy;
  1925.                write32($7FA0,Y0*bytes+X0);
  1926.            {meml[cv.xseg:$7FA0]:=Y0*bytes+X0;}
  1927.          end;
  1928.        __AGX,__xbe,__xga:
  1929.              begin
  1930.            repeat until (mem[cv.xseg:$11] and $80)=0;
  1931.                dx:=abs(X0-X1);
  1932.                dy:=abs(Y0-Y1);
  1933.            mi:=dx;
  1934.            ma:=dy;
  1935.            if mi>ma then swp(mi,ma);
  1936.                meml[cv.xseg:$58]:=col;
  1937.                mem [cv.xseg:$48]:=3;
  1938.                memw[cv.xseg:$78]:=X0;
  1939.                memw[cv.xseg:$7A]:=Y0;
  1940.                memw[cv.xseg:$24]:=2*mi;
  1941.                memw[cv.xseg:$28]:=2*(mi-ma);
  1942.                if x0>x1 then inc(ma);
  1943.                memw[cv.xseg:$20]:=2*mi-ma;
  1944.                memw[cv.xseg:$60]:=ma-1;
  1945.                memw[cv.xseg:$62]:=dy-1;
  1946.  
  1947.                l:=$5118000;
  1948.                if dy>dx then inc(l,1);
  1949.                if Y0>Y1 then inc(l,2);
  1950.                if X0>X1 then inc(l,4);
  1951.            meml[cv.xseg:$7C]:=l;
  1952.          end;
  1953.   end;
  1954. end;
  1955.  
  1956. var
  1957.   ZwinOfs:longint;
  1958.   Zxstep:word;
  1959.  
  1960.  
  1961. procedure setZoomWindow(Xs,Ys,Xe,Ye:word);
  1962. begin
  1963.   case cv.chip of
  1964.      __Tseng:if cv.version=ET_3000 then
  1965.          begin
  1966.            case memmode of
  1967.            _Pl4:Xs:=Xs div 8;
  1968.            _pk4:Xs:=Xs shr 1;
  1969.         {  _p15,_p16:Xs:=Xs*2;
  1970.            _P24:Xs:=Xs*3; }
  1971.            end;
  1972.            ZwinOfs:=bytes*Ys+Xs;
  1973.            wrinx(crtc,$1B,Xs shr 3);
  1974.            wrinx(crtc,$1C,Xe shr 3);
  1975.            wrinx(crtc,$1D,Ys);
  1976.            wrinx(crtc,$1E,Ye);
  1977.            wrinx(crtc,$1F,hi(Ye)+(hi(Ys) shl 3));
  1978.          end
  1979.          else if cv.version>=ET_4W32 then
  1980.          begin
  1981.            wrinx2($217A,$E0,Xs);
  1982.            wrinx2($217A,$E2,Xe-Xs+1);
  1983.            wrinx2($217A,$E4,Ys);
  1984.            wrinx2($217A,$E6,Ye-Ys+1);
  1985.          end;
  1986.   end;
  1987. end;
  1988.  
  1989. procedure setZoomAdr(AdrX,AdrY:word);
  1990. var l:longint;
  1991. begin
  1992.   case memmode of
  1993.        _Pl4:AdrX:=AdrX div 8;
  1994.        _pk4:AdrX:=AdrX shr 1;
  1995.   _p15,_p16:AdrX:=AdrX*2;
  1996.  _P24,_p24b:AdrX:=AdrX*3;
  1997.   end;
  1998.   l:=(bytes*AdrY+AdrX);
  1999.   case cv.chip of
  2000.     __Tseng:if cv.version=ET_3000 then
  2001.         begin
  2002.           l:=(l shr 3)-(ZwinOfs shr 3);
  2003.           wrinx2(crtc,$20,l);
  2004.           modinx(crtc,$23,4,l shr 14);
  2005.         end
  2006.         else if cv.version>=ET_4W32 then
  2007.            wrinx3($217A,$E8,l);
  2008.   end;
  2009.  
  2010. end;
  2011.  
  2012. procedure ZoomOnOff(On:boolean);
  2013. begin
  2014.   case cv.chip of
  2015.     __Tseng:if cv.version=ET_3000 then
  2016.         begin
  2017.           modinx(SEQ,6,$80,ord(On) shl 7);
  2018.           Zxstep:=8;
  2019.         end
  2020.         else if cv.version>=ET_4W32 then
  2021.         begin
  2022.           wrinx($217A,$EF,3);
  2023.           wrinx2($217A,$EB,bytes div 8);
  2024.           modinx($217A,$F7,$80,ord(On) shl 7);
  2025.         end;
  2026.   end;
  2027. end;
  2028.  
  2029. procedure setZoomFactor(Fx,Fy:word);
  2030. begin
  2031.   case cv.chip of
  2032.     __Tseng:if cv.version=ET_3000 then modinx(SEQ,6,$77,Fy+(Fx shl 4))
  2033.         else if cv.version>=ET_4W32 then
  2034.            wrinx($217A,$EE,3+(Fx shl 6)+(Fy shl 4));
  2035.   end;
  2036. end;
  2037.  
  2038.  
  2039.   (* Clock Selection *)
  2040.  
  2041. procedure setclk(Nbr,divi:word);
  2042. var x:word;
  2043. begin
  2044.  
  2045.   if (cv.flags and FLG_StdVGA)>0 then clrinx(crtc,$11,$80);
  2046.  
  2047.   case cv.chip of
  2048.       __AGX:begin
  2049.               if (cv.Version=IIT_AGX1x) then x:=$7F else x:=$77;
  2050.               if Nbr>15 then
  2051.               begin
  2052.                 modinx(cv.IOadr+10,x,$30,nbr shl 4);
  2053.                 modinx(cv.IOadr+10,$6F,$70,(nbr shl 2) or $40);
  2054.                 clrinx(cv.IOadr+10,$70,$80);
  2055.               end
  2056.               else if Nbr>7 then
  2057.               begin
  2058.                 modinx(cv.IOadr+10,x,$30,nbr shl 4);
  2059.                 clrinx(cv.IOadr+10,$6F,$70);
  2060.                 setinx(cv.IOadr+10,$54,$0C);
  2061.                 clrinx(cv.IOadr+10,$70,$80);
  2062.               end
  2063.               else begin
  2064.                 modinx(cv.IOadr+10,$54,$0C,nbr shl 2);
  2065.                 clrinx(cv.IOadr+10,$6F,$70);
  2066.                 modinx(cv.IOadr+10,$70,$80,nbr shl 5);
  2067.               end;
  2068.               modinx(cv.IOadr+10,x,$40,divi shl 6);
  2069.         end;
  2070.  
  2071.     __Ahead:begin  {Only for the B ??}
  2072.               modinx(GRC,$E,$3,nbr shr 2);
  2073.               if divi>0 then x:=$F0 else x:=0;
  2074.               modinx(GRC,$E,$F0,x);
  2075.             end;
  2076.       __ALG:begin
  2077.           modinx(GRC,$C,$20,Nbr shl 3);
  2078.           modinx(GRC,$1F,$4,Nbr shr 1);
  2079.           modinx(GRC,$B,3,divi);
  2080.         end;
  2081.       __ARK:begin
  2082.               modinx(SEQ,$11,$C0,nbr shl 4);
  2083.             end;
  2084.       __ati:begin
  2085.           if cv.version=ATI_18800 then
  2086.                 modinx(cv.IOadr,$B2,64,nbr shl 4)
  2087.           else begin
  2088.         modinx(cv.IOadr,$B9,2,Nbr shr 1);
  2089.         modinx(cv.IOadr,$BE,$10,Nbr shl 1);
  2090.           end;
  2091.           if cv.version<ATI_GUP_3 then x:=$C0 else x:=$40;
  2092.           modinx(cv.IOadr,$B8,x,divi shl 6);
  2093.         end;
  2094.     __chips:if cv.Version<CT_65520 then
  2095.             begin
  2096.               if nbr>3 then nbr:=(nbr-4)*4+2;
  2097.               outp(crtc+6,(inp($3CA) and $FC)+nbr shr 2);
  2098.             end
  2099.         else begin
  2100.               if Nbr>3 then
  2101.               begin
  2102.                 x:=Nbr-4;
  2103.                 Nbr:=2;
  2104.               end;
  2105.               if (rdinx(cv.IOadr,$51) and 4)>0 then {Panel}
  2106.                 modinx(cv.IOadr,$54,$C3,(nbr+(x shl 2)) shl 2)
  2107.           else    {CRT}
  2108.         outp(crtc+6,inp($3CA) and $FC + (x and 3));
  2109.             end;
  2110.    __Compaq:outp($3C2,(inp($3CC) and $EF) + ((nbr and 4) shl 2));
  2111.     __Genoa:modinx(SEQ,7,1,nbr shr 2);
  2112.       __HMC:modinx(SEQ,$E7,$C0,Nbr shl 4);
  2113.    __Mach32:modreg($4AEE,$3C,nbr shl 2);
  2114.    __Mach64:modreg($4AEC,$7F,(nbr and $F)+((divi and 3) shl 4)+$40);
  2115.      __MXIC:modinx(SEQ,$C4,1,Nbr shr 2);
  2116.       __NCR:if cv.version=NCR_77c32BLT then
  2117.               modinx(SEQ,$1F,$60,Nbr shl 3)
  2118.             else modinx(SEQ,$1F,$60,(Nbr shl 4) or $20);
  2119.       __oak:begin
  2120.               modinx($3DE,$D,$20,Nbr shl 3);
  2121.               modinx($3DE,$6,8,nbr);
  2122.             end;
  2123.     __p2000:modinx(GRC,$14,$30,Nbr shl 2);
  2124.        __WD:begin
  2125.           modinx(GRC,$C,2,Nbr shr 1);
  2126.           if cv.version>WD_90c00 then
  2127.         modinx(SEQ,$12,4,nbr shr 1);
  2128.               if cv.version=WD_90c24 then
  2129.               begin
  2130.                 wrinx(SEQ,$35,$50);  {Unlock clock regs}
  2131.                 modinx(SEQ,$31,$18,nbr shl 1);
  2132.               end;
  2133.         end;
  2134.   __realtek:modinx(GRC,$C,$20,Nbr shl 3);
  2135.        __S3:if nbr<>3 then
  2136.             begin
  2137.           wrinx(crtc,$38,$48);
  2138.           wrinx(crtc,$39,$A5);
  2139.           modinx(crtc,$42,$F,Nbr);
  2140.           outp($3C2,inp($3CC) or $C);
  2141.           wrinx(crtc,$39,$5A);
  2142.           wrinx(crtc,$38,$0);
  2143.               nbr:=3;   {Fool std vga}
  2144.         end;
  2145.       __SiS:begin
  2146.               modinx(SEQ,$7,$F,nbr);
  2147.               nbr:=3;
  2148.             end;
  2149.     __Tseng:if cv.version=ET_3000 then modinx(crtc,$24,2,Nbr shr 1)
  2150.         else begin
  2151.           outp($3BF,3);
  2152.           outp(crtc+4,$A0);
  2153.           modinx(crtc,$34,2,Nbr shr 1);
  2154.           modinx(crtc,$31,$C0,Nbr shl 3);
  2155.         end;
  2156.     __Poach,
  2157.      __Trid:begin
  2158.           wrinx(SEQ,$B,0);  {Old mode}
  2159.           case cv.version of
  2160.         TR_8900C,TR_9000C,TR_8900CL..TR_GUI9430:
  2161.             modinx(SEQ,$E,$10,Nbr shl 1);
  2162.           end;
  2163.           if rdinx(SEQ,$B)=0 then;  {New mode}
  2164.           modinx(SEQ,$D,1,Nbr shr 2);
  2165.           if ((cv.version=TR_9000) or (cv.version=TR_9000i)) then
  2166.         modinx(SEQ,$D,$40,nbr shl 3);
  2167.           modinx(SEQ,$D,6,divi shr 1);
  2168.         end;
  2169.       __UMC:modinx(SEQ,7,1,Nbr shr 2);
  2170.    __Video7:begin
  2171.               modinx(SEQ,$A4,$1C,Nbr shl 2);
  2172.               modinx(SEQ,$F8,1,Nbr shr 3);
  2173.             end;
  2174.   end;
  2175.   if (cv.flags and FLG_StdVGA)>0 then
  2176.     outp($3C2,(inp($3CC) and $F3)+((Nbr and 3) shl 2));
  2177. end;
  2178.  
  2179.    {Returns the id of the selected clock and the divisor used on it.
  2180.     The divisor is in 1/12th, Ie. 12 = /1, 24 = /2, 18 = /1.5
  2181.     divid is an ID for the divisor (0,1..)}
  2182. function getclk(var divisor,divid:word):word;
  2183. var x,clknbr:word;
  2184. const
  2185.   _1_  = 12;
  2186.   _1_5 = 18;
  2187.   _2_  = 24;
  2188.   _3_  = 36;
  2189.   _4_  = 48;
  2190.  
  2191.   triddiv:array[0..3] of word=(_1_,_2_ ,_4_,_1_5);
  2192.    atidiv:array[0..3] of word=(_1_,_2_ ,_3_,_4_);
  2193.    otidiv:array[0..3] of word=(_1_,_2_ ,_3_,_3_);
  2194.  P2000div:array[0..3] of word=(_1_,_4_ ,_2_,_4_);
  2195.    RTGdiv:array[0..3] of word=(_1_,_1_5,_2_,_4_);
  2196.    ALGdiv:array[0..3] of word=(_1_,_2_ ,_4_,_4_);
  2197. begin
  2198.   divisor:=12;   {standard no division}
  2199.   clknbr:=(inp($3CC) shr 2) and 3;
  2200.   divid:=0;
  2201.   case cv.chip of
  2202.       __AGX:begin
  2203.               if (cv.Version=IIT_AGX1x) then x:=$7F else x:=$77;
  2204.               if (rdinx(cv.IOadr+10,$6F) and $40)>0 then
  2205.               begin
  2206.                 clknbr:=((rdinx(cv.IOadr+10,x) shr 4) and 3)+16;
  2207.                 inc(clknbr,(rdinx(cv.IOadr+10,$6F) and $30) shr 2);
  2208.               end
  2209.               else begin
  2210.                 clknbr:=(rdinx(cv.IOadr+10,$54) shr 2) and 3;
  2211.                 if (rdinx(cv.IOadr+10,$70) and $80)>0 then inc(clknbr,4);
  2212.                 if clknbr=3 then
  2213.                   clknbr:=((rdinx(cv.IOadr+10,x) shr 4) and 3)+8;
  2214.               end;
  2215.               if (rdinx(cv.IOadr+10,x) and $40)>0 then
  2216.               begin
  2217.                 divisor:=_2_;
  2218.                 divid:=1;
  2219.               end;
  2220.         end;
  2221.     __Ahead:begin    {Only for the B ??}
  2222.               x:=rdinx(GRC,$E);
  2223.               if ((x shr clknbr) and $10)>0 then
  2224.               begin
  2225.                 divid:=1;
  2226.                 divisor:=_2_;
  2227.               end;
  2228.               inc(clknbr,(x and 3) shl 2)
  2229.             end;
  2230.       __ALG:begin
  2231.           if (rdinx(GRC,$C) and $20)>0 then inc(clknbr,4);
  2232.         (*  if (rdinx(GRC,$B) and 2)>0 then divisor:=24;*)
  2233.           if (rdinx(GRC,$1F) and $4)>0 then inc(clknbr,8);
  2234.           divid:=rdinx(GRC,$B) and 3;
  2235.           if cv.version=ALG_2101 then divisor:=RTGdiv[divid]
  2236.                      else divisor:=ALGdiv[divid];
  2237.         end;
  2238.      __Alli:if clknbr=3 then clknbr:=rgs.xxregs.x[$D8] and $F;
  2239.       __ARK:begin
  2240.               inc(clknbr,(rdinx(SEQ,$11) and $C0) shr 4);
  2241.             end;
  2242.       __ati:begin
  2243.           if cv.version=ATI_18800 then
  2244.               begin
  2245.                 if (rdinx(cv.IOadr,$B2) and $40)>0 then inc(clknbr,4);
  2246.               end
  2247.           else begin
  2248.         if (rdinx(cv.IOadr,$B9) and 2)>0 then inc(clknbr,4);
  2249.         if (rdinx(cv.IOadr,$BE) and $10)>0 then inc(clknbr,8);
  2250.           end;
  2251.           if cv.version<ATI_GUP_3 then x:=$C0 else x:=$40;
  2252.           divid:=(rdinx(cv.IOadr,$B8) and x) shr 6;
  2253.           divisor:=atidiv[divid];
  2254.         end;
  2255.     __chips:if cv.Version<CT_65520 then
  2256.             begin
  2257.               if clknbr=2 then clknbr:=(inp($3CA) and 3)+4;
  2258.         end
  2259.             else if cv.Version<CT_64300 then
  2260.             begin
  2261.               if (rdinx(cv.IOadr,$51) and 4)>0 then {Panel}
  2262.               begin
  2263.                 clknbr:=(rdinx(cv.IOadr,$54) shr 2) and 3;
  2264.                 x  :=(rdinx(cv.IOadr,$54) shr 4) and 3;
  2265.               end
  2266.           else    {CRT}
  2267.         x:=inp($3CA) and 3;
  2268.               if clknbr>=2 then clknbr:=x+4;
  2269.             end;
  2270.    __Compaq:begin
  2271.               clknbr:=(inp($3CC) shr 2) and 7;
  2272.               if rdinx(GRC,$F)<>$A5 then inc(clknbr,8);
  2273.             end;
  2274.     __Genoa:if (rdinx(SEQ,7) and 1)>0 then inc(clknbr,4);
  2275.       __HMC:inc(clknbr,(rdinx(SEQ,$E7) and $C0) shr 4);
  2276.    __Mach32:begin
  2277.               clknbr:=(inp($4AEE) shr 2) and $F;
  2278.               if (inp($4AEE) and $40)>0 then divisor:=_2_;
  2279.             end;
  2280.    __Mach64:begin
  2281.               clknbr:=inp($4AEC);
  2282.               divid:=(clknbr shr 4) and 3;
  2283.               case divid of
  2284.                 1:divisor:=_2_;
  2285.                 2:divisor:=_4_;
  2286.               end;
  2287.               clknbr:=clknbr and 15;
  2288.             end;
  2289.      __MXIC:if (rdinx(SEQ,$C4) and 1)>0 then inc(clkNbr,4);
  2290.       __NCR:if cv.version=NCR_77c32BLT then
  2291.               inc(ClkNbr,(rdinx(SEQ,$1F) and $60) shr 3)
  2292.             else if (rdinx(SEQ,$1F) and $40)>0 then inc(ClkNbr,4);
  2293.       __oak:begin
  2294.               if (rdinx($3DE,$D) and $20)>0 then inc(clknbr,4);
  2295.               if cv.Version>=OAK_083 then
  2296.               begin
  2297.                 if (rdinx($3DE,6) and 8)>0 then inc(clknbr,8);
  2298.                 divisor:=otidiv[rdinx($3DE,$21) and 3];
  2299.                { if (rdinx($3DE,$14) and 1)>0 then divisor:=divisor*3; }
  2300.               end;
  2301.         end;
  2302.     __p2000:begin
  2303.           inc(clknbr,(rdinx(GRC,$14) and $30) shr 2);
  2304.           divisor:=p2000div[(rdinx(GRC,$14) shr 2) and 3];
  2305.         end;
  2306.        __WD:begin
  2307.           if (rdinx(GRC,$C) and 2)>0 then inc(clknbr,4);
  2308.           if cv.version>WD_90c00 then
  2309.         if (rdinx(SEQ,$12) and 4)>0 then inc(clknbr,8);
  2310.               if cv.version=WD_90c24 then
  2311.                 clknbr:=(clknbr and 3)+(rgs.seqregs.x[$31] and $18) shr 1;
  2312.         end;
  2313.   __Realtek:begin
  2314.           if (rdinx(GRC,$C) and $20)>0 then inc(clknbr,4);
  2315.           divisor:=rtgdiv[rdinx(GRC,$B) and 3];
  2316.         end;
  2317.        __S3:if clknbr=3 then
  2318.         begin
  2319.           wrinx(crtc,$38,$48);
  2320.           wrinx(crtc,$39,$A5);
  2321.           clknbr:=rdinx(crtc,$42) and $F;
  2322.           wrinx(crtc,$39,$5A);
  2323.           wrinx(crtc,$38,$0);
  2324.         end;
  2325.       __SiS:if clknbr=3 then clknbr:=rdinx(SEQ,7) and $F;
  2326.     __Tseng:if cv.version=ET_3000 then
  2327.         begin
  2328.           if (rdinx(crtc,$24) and 2)>0 then inc(clknbr,4);
  2329.        {   if (rdinx(SEQ,7) and $40)>0 then divisor:=24; }
  2330.         end
  2331.         else begin
  2332.           if (rdinx(crtc,$34) and 2)>0 then inc(clknbr,4);
  2333.           inc(clknbr,(rdinx(crtc,$31) and $C0) shr 3);
  2334.           case rdinx(SEQ,7) and $42 of
  2335.            $40:divisor:=24;
  2336.            $42:divisor:=48;
  2337.           end;
  2338.         end;
  2339.     __Poach,
  2340.      __Trid:begin
  2341.           wrinx(SEQ,$B,0);  {Old mode}
  2342.           case cv.version of
  2343.                TR_8900C,TR_9000C,TR_8900CL..TR_GUI9430:
  2344.             if (rdinx(SEQ,$E) and $10)>0 then inc(clknbr,8);
  2345.           end;
  2346.           if rdinx(SEQ,$B)=0 then;  {New mode}
  2347.           if (rdinx(SEQ,$D) and 1)>0 then inc(clknbr,4);
  2348.           if ((cv.version=TR_9000) or (cv.version=TR_9000i))
  2349.         and ((rdinx(SEQ,$D) and $40)>0) then inc(clknbr,8);
  2350.           divisor:=triddiv[(rdinx(SEQ,$D) shr 1) and 3];
  2351.         end;
  2352.       __UMC:begin
  2353.           if (rdinx(SEQ,7) and 1)>0 then inc(clkNbr,4);
  2354.           if (rdinx(SEQ,9) and $80)>0 then divisor:=24;
  2355.         end;
  2356.    __Video7:if cv.version>=V7_208A then
  2357.             begin
  2358.               clknbr:=(rdinx(SEQ,$A4) shr 2) and 7;
  2359.               if (rdinx(SEQ,$F8) and 1)>0 then inc(clkNbr,8);
  2360.             end;
  2361.   end;
  2362.   getclk:=clknbr;
  2363. end;
  2364.  
  2365. function getClockFreq:longint;    {Effective pixel clock in kHz}
  2366. const
  2367.   wd24clk:array[0..15] of longint=(29979,77408,0,80092,25175,28322
  2368.           ,65000,36000,39822,50114,42060,44297,31500,35501,75166,50114);
  2369.  
  2370. var clknbr,divisor,x,reg:word;
  2371.     clk,ref:longint;
  2372. begin
  2373.   clknbr:=getclk(divisor,x);
  2374.   clk:=(cv.clks[clknbr]*12) div divisor;
  2375.   ref:=(14318*12) div divisor;
  2376.   case cv.clktype of
  2377.        clk_unk:;
  2378.        clk_ICD2061,clk_ICD2061A:
  2379.                if (clknbr and 3)=3 then clk:=0; {Prog clock - Can't read}
  2380.       clk_sdac:(*if clknbr=2 then*)
  2381.                begin
  2382.                  clknbr:=(clknbr and 3)*2;
  2383.                  clk:=(ref*((rgs.dacinxd.x[clknbr] and 127)+2))
  2384.                    div (((rgs.dacinxd.x[clknbr+1] and 31)+2) shl (rgs.dacinxd.x[clknbr+1] shr 5));
  2385.                end;
  2386.        clk_STG:begin
  2387.                  clknbr:=clknbr*2+$20;
  2388.                  clk:=ref*(rgs.dacinxd.x[clknbr]+2) div
  2389.                       (((rgs.dacinxd.x[clknbr+1] and $1F)+2)
  2390.                       shl (rgs.dacinxd.x[clknbr+1] shr 5));
  2391.                end;
  2392.    clk_TVP302x:case clknbr and 3 of
  2393.                   0:clk:=(25175*12) div divisor;
  2394.                   1:clk:=(28322*12) div divisor;
  2395.                 2,3:clk:=(ref*8*((rgs.dacinxd.x[$41] and 127)+2)) div
  2396.                      (((rgs.dacinxd.x[$40] and 31)+2) shl (rgs.dacinxd.x[$42] and 3));
  2397.                end;
  2398.      clk_CHRON:begin
  2399.                  clknbr:=(clknbr and 15)*2;
  2400.                  clk:=(ref*(rgs.dacinxd.x[clknbr]+8)) div ((((rgs.dacinxd.x[clknbr+1]
  2401.                     and 63)+2) shl (rgs.dacinxd.x[clknbr+1] shr 6)));
  2402.                end;
  2403.      clk_MUSIC:begin
  2404.                  clknbr:=(clknbr and 7)*2;
  2405.                  clk:=(ref*((rgs.dacinxd.x[clknbr] and 127)+1)) div
  2406.                    ((((rgs.dacinxd.x[clknbr+1] and 15)+1) shl
  2407.                     ((rgs.dacinxd.x[clknbr+1] shr 4) and 3)));
  2408.                end;
  2409.     clk_IBM52x:if (rgs.dacinxd.x[$10] and 1)>0 then
  2410.                begin
  2411.                  clknbr:=((clknbr and 7)*2)+$20;
  2412.                  clk:=(ref*((rgs.dacinxd.x[clknbr] and 63)+65)) div
  2413.                    ((rgs.dacinxd.x[clknbr+1] and $1F) shl
  2414.                     (3-(rgs.dacinxd.x[clknbr] shr 6)));
  2415.                end
  2416.                else begin
  2417.                 (* clknbr:=(clknbr and 15)+$20;
  2418.                  clk:=(ref*((rgs.dacinxd.x[clknbr] and 63)+65)) div
  2419.                    ((rgs.dacinxd.x[$14] and $1F) shl
  2420.                     (3-(rgs.dacinxd.x[clknbr] shr 6))); *)
  2421.                end;
  2422.   else
  2423.     case cv.chip of
  2424.      __Cir54:if (clknbr=0) and (cv.version<=CL_GD5402) then clk:=25175
  2425.              else begin
  2426.            clk:=(ref*rgs.seqregs.x[$B+clknbr]) div (rgs.seqregs.x[$1B+clknbr] shr 1);
  2427.            if (rgs.seqregs.x[$1B+clknbr] and 1)>0 then clk:=clk div 2;
  2428.            case (rgs.seqregs.x[7] and 6) of
  2429.          2:clk:=clk div 2;
  2430.          4:clk:=clk div 3;
  2431.            end;
  2432.              end;
  2433.      __chips:if (cv.version=CT_64300) and (clknbr>=2) then
  2434.                clk:=(ref*2*(rgs.xxregs.x[$31]+2)) div (rgs.xxregs.x[$32]+2);
  2435.         __S3:if (cv.Version=S3_732) or (cv.Version=S3_764) then
  2436.                case clknbr of
  2437.                  0:clk:=(25175*12) div divisor;
  2438.                  1:clk:=(28322*12) div divisor;
  2439.                else
  2440.                  clk:=(ref*((rgs.seqregs.x[$13] and $7F)+2)) div
  2441.                     (((rgs.seqregs.x[$12] and $1F)+2) shl (rgs.seqregs.x[$12] shr 5));
  2442.                end;
  2443.       __Trid:if cv.version=TR_GUI9440 then   {Not there yet}
  2444.                case clknbr and 3 of
  2445.                  0:clk:=(25175*12) div divisor;
  2446.                  1:clk:=(28322*12) div divisor;
  2447.                  2:begin
  2448.                      clknbr:=(((rgs.dacregs[9] shl 1)+(rgs.dacregs[8] shr 7)) and $1F)+1;
  2449.                      clk:=((ref*((rgs.dacregs[8] and $7F)+3)) div
  2450.                           (clknbr shl (rgs.dacregs[9] shr 4)));
  2451.                    end;
  2452.                end;
  2453.         __WD:if cv.version=WD_90c24 then
  2454.              begin    {WD90c24 internal clock}
  2455.                if clknbr<>2 then clk:=WD24clk[clknbr]
  2456.                else clk:=(rgs.seqregs.x[$32]*longint(447443)) div 1000;
  2457.              end;
  2458.     end;
  2459.   end;
  2460.   getClockFreq:=clk;
  2461. end;
  2462.  
  2463.